方案选型:
1.同步锁(单线程,集群可能会失效)
2.分布式锁如redis(高并发 实现复杂)
2.业务字段加唯一约束(简单)
3.令牌表+唯一约束(简单推荐)
4.mysql的on duplicate key update(简单 联合唯一索引 防重)
5.共享锁+普通索引(简单)
6.利用MQ或者Redis扩展(排队)
7.其他方案如多版本控制MVCC 乐观锁 悲观锁(select for update) 状态机等。。。
对客户端请求排队或者单线程都可以处理幂等问题,需要根据具体业务选择合适的方案但必须前后端一起做,前端做了可以提升用户体验,后端则可以保证数据安全。
编程中常见幂等
select查询天然幂等
delete删除也是幂等,删除同一个多次效果一样
update直接更新某个值的,幂等
update更新累加操作的,非幂等
insert非幂等操作,每次新增一条
产生原因
由于重复点击或者网络重发 eg:
点击提交按钮两次;
点击刷新按钮;
使用浏览器后退按钮重复之前的操作,导致重复提交表单;
使用浏览器历史记录重复提交表单;
浏览器重复的HTTP请;
nginx重发等情况;
分布式RPC的try重发等;
文档
分布式接口幂等性、分布式限流(Guava 、nginx和lua限流)