在系统中,一个接口运行多次,与运行一次的效果是一致的;
可以防止前端重复提交、接口重试和前端操作抖动等操作;
核心思想:通过唯一的业务单号(主键)保证幂等;
在非并发情况下,查询业务单号看有没有操作过,没有则执行操作;
并发情况下,整个操作过程加锁;
select: 不会对业务数据有影响,天然幂等;
update: 更新操作传入数据版本号,通过乐观锁实现幂等;
分为有唯一业务号和没有唯一业务号:
有唯一业务号时:通过乐观锁版本号进行更新;
有唯一业务号:用token机制解决;
delete: 分为有唯一业务号和没有唯一业务号:
有唯一业务号时:第一次已经删除,第二次也不会有影响;
没有唯一业务号:用token机制解决;
insert: 分为有唯一业务号和没有唯一业务号:
有唯一业务号时:例如秒杀系统中,用户id+商品id组成唯一业务号,可以通过分布式锁保证接口幂等,业务执行完成后,不进行释放锁,让其自动过期释放;
没有唯一业务单号,使用token机制保证幂等;
混合操作:找到操作的唯一业务单号,有则可以使用分布式锁,没有可以通过token保证幂等;
token机制:以用户注册场景为例,用户在进入注册页面时,从后台获取一个token,提交注册时携带这个token,后台使用这个token获取分布式锁,完成insert操作后,不释放锁,等待过期自动释放锁;