接口幂等性
在系统中,一个接口运行多次,与运行一次的效果是一致的。
什么情况下需要幂等性
重复提交、接口重试、前段操作抖动等
业务场景:用户多次点击提交订单,后台应只生成一个订单
业务场景:支付,由于网络问题重发,应只扣一次钱
并不是所有接口都要求幂等性,要根据业务而定
保证幂等性的策略有哪些?
幂等性的核心思想:通过唯一的业务单号保证幂等
非并发情况下,查询业务单号有没有操作过,没有则执行操作
并发的情况下,整个操作过程枷锁
- select操作:不会对业务数据有影响,天然幂等
- delete操作:第一次已经删除,第二次也不会影响
- update操作:更新操作传入数据版本号,通过乐观锁实现幂等性
- insert操作:此时没有唯一业务单号,用token保证幂等性
- 混合操作:找到操作的唯一业务单号,有则可以使用分布式锁,没有可以通过token保证幂等性
update操作的幂等性
根据唯一业务单号去更新数据的情况
用户查询出要修改的数据,系统将数据返回页面,将数据版本号放入隐藏域
用户修改数据点击提交,将版本号一同提交给后台
后台使用版本号作为更新条件
Update version = version+1, xxx=${xxx} where id=xxx and version = version
使用客观锁和update行锁保证幂等
更新操作没有唯一业务单号,使用token机制
insert操作的幂等性
有唯一业务号的insert操作,如:秒杀,商品ID+用户ID
可通过分布式锁,保证接口幂等性
业务执行完成后,不进行锁释放,让其过期自动释放
没有唯一业务号的insert操作,比如用户注册,点击多次
使用token机制,保证幂等性
进入到注册页面时,后台统一生成token,返回前段隐藏域中
用户在页面点击提交时,将token一同传入后台
使用token获取分布式锁,完成insert操作
执行成功后,不释放锁,等待过期自动释放
混合操作的幂等性
混合操作,一个接口包含多种操作
同样可以使用token机制