结合案例、列举场景的接口幂等性设计方案。
方案 1. 状态机
业务场景,数据审核成功后进行短信通知,或者是订单状态变成已支付后,短信通知用户订单生成的详细信息,等等和状态有关的操作。
假设 status:0(待审核)、1(已审核)、2(已退回)。
批量审核场景幂等性代码设计
shtz 方法 中的 sql 语句如下:update tab_dzzzhz set status = 1 where (status = 0 or status = 2) and id = #{id}
生效原理:用的是Mysql,Mysql 中的 update 原理,先是对查询条件中命中的数据进行上锁,然后接着修改这条数据。因此当有多个请求打过来,对指定 id、status 的这条数据的更新时,其实是一个串行化操作。第一个请求更新好数据后,数据的 status 变为了 1,第二个请求过来,发现没有符合条件的数据要更新了,直接 return 0(影响的行数为 0)。此时代码中就可以认为此次更新操作是多余的。就避免了重复短信通知的问题
方案 2. redis 分布式锁
这个没啥好说的,就是利用 lua 脚本,保证对应 查询、更新操作 的业务逻辑是原子性的。至于 lua 脚本锁的 key 根据各位的业务逻辑来。