什么是幂等性
幂等性是系统服务对外一种承诺,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。
如何保证幂等
- 使用数据库实现幂等性
- 使用 JVM 锁实现幂等性
- 使用分布式锁实现幂等性
一. 数据库实现
数据库实现幂等性的方案有四个:
1.状态机幂等
如果业务上需要修改订单状态,例如订单状态有待支付,支付中,支付成功,支付失败。设计时最好只支持状态的单向改变。这样在更新的时候就可以加上条件,多次调用也只会执行一次。例如想把订单状态更新为支持成功,则之前的状态必须为支付中
update table_name set status = 支付成功 where status = 支付中
2. 悲观锁来实现幂等性
select * from table_name where order_id = order_id for update
3. 唯一索引来实现幂等性
alter table table_name add unique(order_id)
4. 通过乐观锁来实现幂等性
- 1.查询数据获得版本号
- 2.通过版本号去更新,版本号匹配则更新,版本号不匹配则不更新