调用方对系统进行重复的调用,不管调用多少次,调用对系统的影响都是相同的。系统默认认为外部系统调用失败是常态,失败之后会有重试。
幂等性虽然简化了客户端的操作,但是以服务端逻辑变为复杂为代价,除非有特殊业务要求,否则,尽量不要保证幂等行
- 增加了保证幂等性的业务逻辑,增加了业务代码的复杂度
- 并行代码改为了串行代码,降低了代码的执行效率
- 查一下上次执行状态,没有则进行第一次的请求
- 在服务状态改变前,增加放置重复提交的逻辑
数据库增加一个version字段,更新前判定版本号,版本号为预期版本号就执行更新,否则更新失败。或者加一个时间戳字段,更新时校验时间戳
每次去操作数据时,都觉得别人中途会修改,所以每次在拿数据的时候都会上锁,加锁,再配合事务解决幂等性问题。
适用更新场景
查询条件必须是索引,不然会锁表
锁住记录,别的请求只能等待,事务太长,影响性能。
select + insert+update (主键或者唯一标识)
如果重复概率低,可以直接insert+唯一标识(主键)捕捉异常返回成功。
状态机幂等
防重表去重
建一种去重表,然后使用唯一索引,将更新语句与操作去重表的逻辑放在一个事务里面,异常会回滚
请求过来时,先去尝试获得分布式锁,如果获得成功,就执行业务逻辑,反之获取失败的话,就舍弃请求直接返回成功