幂等性设计
在增删改查四个操作中,尤为注意就是增加和修改
查询操作
查询结果是不会有改变的,查询一次和多次得到的结果是一样的,select是天然幂等性的
删除操作
删除一次和删除多次都是把数据删除.(返回的结果不一样,删除的数据不存在,返回0,删除的数据多条,返回的结果多个,在不考虑返回结果的情况下,删除操作也具有幂等性)
更新操作
大多数情况下是幂等的,但是在少数情况下不是幂等的,比如
- 把表中的id为xxx的记录a字段的值设置为1,这种操作不管执行多少次都是幂等的
- 把表中id为xxx的记录的a字段值增加1,这种操作就不是幂等的
新增操作
增加在重复提交的情况下需要考虑幂等性的问题,比如支付的问题
如何保证幂等性
-
通过代码逻辑判断实现
- 数据库各种锁机制
- 分布式各种锁机制
- 业务代码各种锁机制
-
使用token机制(广泛)[cookie/session->防重复提交->csrf]
- token机制实现的步骤
1.生成全局唯一的token,token放到redis或者jvm内存,token会在页面跳转时获取,存放到pageScope中,支付请求提交先获取token,如果是前后分离的项目,token应该在生成结算信息的时候交给前端
2.提交后 后台校验token,执行成功同时删除token,生成新的token更新redis,当第一次提交以后token就被更新了,页面再次提交的携带的token是已经被删除的token,后台验证失败不让提交
MQ异步
操作注意的细节:
1.过期订单我们需要关闭,关闭之前需要判断是否支付过了,如果支付过了,就判断不用关闭
2.过期订单我们收到,判断关闭的状态,有可能这个时候订单恰好被支付了,我们需要实时的获取此订单的支付信息,使用分布式锁的方式,这样才能够避免订单状态错误