(1)订单模块---创建订单和更新订单如何保证幂等

2023-09-26 23:32:05 浏览数 (1)

存储系统最基本的原则是保证数据不能错

前言.什么是幂等

幂等:系统间多次重复请求,跟第一次请求产生的结果一样,而无其他的影响

用户在立即购买点击下单时候,有可能重复点击下单按钮,如果后端根据请求的次数相应的创建多笔订单,这是系统的bug,实际上用户只是点击一次下单,所以要保证下单接口的幂等性,对于业务订单的支付状态或者物流状态变更都是基于订单表进行的更新update操作,也需要保证幂等性

知识点:数据库select update(不是累加减操作) delete(逻辑删除)天然支持幂等性,而新增 insert不支持幂等

1. 创建订单 怎么保证幂等性

其实就是给每个请求分配唯一的订单号,这个订单号要保证全局唯一,其次需要是递增,能看出下单请求的次序

具体就是需要用户在下单前,先请求后台服务获取一个订单号,然后再带着订单号下单,具体后台处理逻辑就是 先查询然后新增,查询是为了保证不重复插入,如果查询有数据,直接返回给客户端,否则新增

注意事项:或者直接新增,如果有报唯一索引冲突,说明之前有过相同的插入记录,此时需要返回客户端的是成功提示,而不是失败,提升用户体验

2.订单更新 怎么保证幂等

用户立即购买,并且支付后,订单的状态需要更新为支付成功

可以直接利用数据库的更新操作保证幂等性,但是具体到业务场景,还需要避免ABA问题,这个时候,需要多加个维度保证数据更新的幂等,答案是维护一个版本号,每次更新操作,对比版本号,然后递增版本号和更新业务数据,具体sql如下:

update stock set total_count= total_count -1,version = version 1 where order_id = 666 and version = 888 and total_count>0

总结:

为什么创建订单分配一个预制的唯一序列号就能保证唯一,因为相当于系统给这个请求打上了一个标记,类似cookie的原理,后端最终保证数据的幂等,有些就是因为系统框架,rpc请求失败后会自动重试,所以后端是保证幂等性的中坚力量

利用版本号保证幂等是系统底层的safe无锁操作思想延伸的具体应用场景,解决ABA问题增加版本号相当于需要给数据再加一个维度才能辨析出不同的操作次数,如果不加版本号是区分不出来多次重复的update请求的

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞