资讯 更多 >>
我胡汉三又回来了图片_我胡汉三又回来
1992年,塞族士兵枪杀了无辜的妇女...
北京疾控发布预防流感家庭消毒指南
追踪马斯克私人飞机动向的大学生新...
全球消息!水下迷宫该怎么弄_水下迷宫
压缩分卷文件怎么解压_压缩分卷怎么...
柱形图数据表怎么编辑_柱形图
鼓励的反义词_鼓励的意思_世界热文
天天速看:多肉小说推荐_全是肉的小...
2017年专八考试时间_2017年赚钱好项...
业界更多 >>
环球快讯:工信部:加快电力设备绿色...
天天百事通!欧洲试图发展动力电池...
焦点信息:2022激光聚会活动回顾|AC...
环球热推荐:丹佛斯服贸会携手三大...
天天速递!精彩依旧,图尔克荣获202...
环球速看:运用数字孪生+智能算法,...
世界播报:锂电池快充或将突破技术难关
每日快讯!喜报!清能德创荣获国家级...
天天要闻:腾讯成国内首个获批创新...
环球消息!机器人的仿生之道
看点:广域网:通往可扩展物联网的网关
当前滚动:Kerk专利设计的静音轴套-...
天天时讯:工信部:我国已建成60家...
每日看点!机器人一定要像人吗?实力...
天天信息:移动终端市场遭遇低谷,纷...
【环球聚看点】共筑5G新生态 全面...
快看点丨马斯克:未来十年,新车有...
环球百事通!乘联会:预估8月新能源...
世界时讯:拥抱电气化,汽车动力进...
新消息丨发展燃料动力锂电池和混合...
专题报道 
当前位置: 资讯 > >> 正文
 
创建订单和更新订单的数据一致性问题
来源:程序员客栈     时间:2023-02-27 15:53:15

大家好,我是Leo。


(资料图)

聊一下创建订单和更新订单的数据一致性问题,文章分类主要是MySQL,Redis,秒杀系统,RocketMQ,计算机网络,大厂面试,设计模式,Nginx。先整理一下。方便粉丝更好的阅读,同时也方便自己不断的复习沉淀。

重复下单

我们在下单时,往往会因为网络问题出现多次下单的情况,比如点了下单一直没反应,我们就会多次的重复点击,如果服务端做了校验可能不会出现什么问题,如果没做的话在订单列表里可能就会出现多个订单。

解决方案就是我们可以对订单实现具备幂等性。

幂等性就是无论点击多少次下单,始终只会创建一条记录。

如果系统体量比较大的话,我们可以独立一个生成订单号服务,体量不大的话可以封装成一个API给订单服务使用。

当用户从购物车界面点结算挑战到订单详情界面就请求一次生成订单号,使这个订单详情页的缓存中保存一条唯一的订单号

只要每次下单请求的订单号是唯一的,我们再借助数据库中主键唯一约束性来实现,订单数据的唯一性。

如果主键是订单号的话,主键自动帮我们实现了。如果主键是时间戳ID的话,我们把订单号字段设为唯一索引,同时也可以避免重复下单的校验需求。

ABA问题

订单服务会经常出现ABA问题。

什么是 ABA 问题呢?我们举个例子,订单支付之后,小二要发货,发货完成后要填个快递单号。假如小二填了一个单号 666,刚填完,发现填错了,赶紧再修改成 888。对订单服务来说,这就是 2 个更新订单的请求。

正常情况下,订单中的快递单号会先更新成 666,再更新成 888,这是没问题的。那不正常情况呢?666 请求到了,单号更新成 666,然后 888 请求到了,单号又更新成 888,但是 666 更新成功的响应丢了,调用方没收到成功响应,自动重试,再次发起 666 请求,单号又被更新成 666 了,这数据显然就错了。这就是ABA 问题。

解决方案就是我们在订单表中加一个版本号这个字段。

在查询订单时,我们可以把版本号返回给前端,前端在处理下单时,以参数的形式传递给后端,后端收到版本号之后与数据库的实际数据对比,如果版本号符合,修改数据,版本号递增。

为了考虑数据安全性,我们一般会将 校验版本号,修改数据,修改版本号在一个事务中执行

UPDATE orders set tracking_number = 666, version = version + 1WHERE version = 8;

通过版本号,我们就可以得知,在每次修改数据时,是否有其他人修改过。这样就不会出现ABA问题了。

关键词: 数据一致性 解决方案 快递单号

上一条:春天流感病毒活跃,“茧计划”为刚出生宝宝建立“保护圈” 下一条:天天精选!创建全国文明城市|倡议:争创文明城市 安全有序出行