接口幂等性
在系统中,一个接口运行多次,与运行一次的效果是一致的
什么情况下需要幂等性
- 重复提交、接口重试、前端操作抖动等
- 业务场景:用户多次点击提交订单,后台应只生成一个订单
- 业务场景:支付时,由于网络问题重发,应该只扣一次钱
- 并不是所有的接口都要求幂等性,要根据业务而定
幂等性的核心思想:通过唯一的业务单号保证幂等
- 非并发情况下,查询业务单号有没有操作过,没有则执行操作
- 并发的情况下,整个操作过程加锁
- Select操作:不会对业务数据有影响,天然幂等
- Delete操作:第一次已经删除,第二次也不会有影响
- Update操作:更新操作传入数据版本号,通过乐观锁实现幂等性(先查再更新)
update自身带锁。直接update不会出现并发修改问题。乐观锁是先查询在修改
Update 商品表 set 库存 = 库存 - 购买量 ,version = 查询version值+1 where version = #{查询的version值} and 商品ID= #{商品ID}
- Insert操作:此时没有唯一业务单号,使用Token保证幂等
- 混合操作:找到操作的唯一业务单号,有则可使用分布式锁,没有可以通过Token保证幂等