存储系统最基本的原则是保证数据不能错
幂等:系统间多次重复请求,跟第一次请求产生的结果一样,而无其他的影响
用户在立即购买点击下单时候,有可能重复点击下单按钮,如果后端根据请求的次数相应的创建多笔订单,这是系统的bug,实际上用户只是点击一次下单,所以要保证下单接口的幂等性,对于业务订单的支付状态或者物流状态变更都是基于订单表进行的更新update操作,也需要保证幂等性
知识点:数据库select update(不是累加减操作) delete(逻辑删除)天然支持幂等性,而新增 insert不支持幂等
其实就是给每个请求分配唯一的订单号,这个订单号要保证全局唯一,其次需要是递增,能看出下单请求的次序
具体就是需要用户在下单前,先请求后台服务获取一个订单号,然后再带着订单号下单,具体后台处理逻辑就是 先查询然后新增,查询是为了保证不重复插入,如果查询有数据,直接返回给客户端,否则新增
注意事项:或者直接新增,如果有报唯一索引冲突,说明之前有过相同的插入记录,此时需要返回客户端的是成功提示,而不是失败,提升用户体验
用户立即购买,并且支付后,订单的状态需要更新为支付成功
可以直接利用数据库的更新操作保证幂等性,但是具体到业务场景,还需要避免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请求的
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。