接口幂等性设计
为什么会产生接口幂等性问题?
1.网络波动,可能会引起重复请求。
2.用户重复操作,用户再操作时可能会无意触发多次下单交易,甚至没有响应而有意触发多次交易应用。
3.使用了失效或则超时重试机制(如nginx重试、RPC重试或业务层重试等)。
4.使用浏览器后按钮重复之前的页面操作,导致重复提交表单
如何保证接口幂等性?
1.一个方向是客户端防止重复调用。
2.一个是服务端进行校验。
Update操作幂等性原理
我们可以使用乐观锁。需要在表中增加一个timestamp或者version字段,这里以version字段为例。
--在更新数据之前先查询一下数据:
select id,name,age,version from user id=123;
如果数据存在,假设查到的version等于1,再使用id和version字段作为查询条件更新数据:
update user set age=age+1,version=version+1
where id=123 and version=1;
更新数据的同时version+1,然后判断本次update操作的影响行数,如果大于0,则说明本次更新成功,如果等于0,则说明本次更新没有让数据变更。

具体步骤:
- 先根据id查询用户信息,包含version字段
- 根据id和version字段值作为where条件的参数,更新用户信息,同时version+1
- 判断操作影响行数,如果影响1行,则说明是一次请求,可以做其他数据操作。
- 如果影响0行,说明是重复请求,则直接返回成功。