学习笔记:保证接口幂等性

接口幂等性

在系统中,一个接口运行多次,与运行一次的效果是一致的。

什么情况下需要幂等性

重复提交、接口重试、前段操作抖动等

业务场景:用户多次点击提交订单,后台应只生成一个订单

业务场景:支付,由于网络问题重发,应只扣一次钱

并不是所有接口都要求幂等性,要根据业务而定

保证幂等性的策略有哪些?

幂等性的核心思想:通过唯一的业务单号保证幂等

非并发情况下,查询业务单号有没有操作过,没有则执行操作

并发的情况下,整个操作过程枷锁

  • 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机制

上一篇:Mybatis 使用@Insert注解 插入多条记录JSONObject 转 List 的几种方法


下一篇:Safari 3D transform变换z-index层级渲染异常的研究