网站有哪些推荐,专业网站建设推荐q479185700顶上,wordpress 中文网站,wordpress布谷鸟主题本文导读
从事京东零售供应链库存业务#xff0c;库存数量操作增减十分频繁#xff0c;并且项目开发中会常常遇到各种并发情况#xff0c;一旦库存数量操作有误#xff0c;势必给前台销售产生损失影响#xff0c;因此需要关注对库存数量并发操作下的一致性问题。
大部分…本文导读
从事京东零售供应链库存业务库存数量操作增减十分频繁并且项目开发中会常常遇到各种并发情况一旦库存数量操作有误势必给前台销售产生损失影响因此需要关注对库存数量并发操作下的一致性问题。
大部分情况下加锁可以很好地解决并发问题但是只要加上锁后就一定不会有并发问题吗哪些情况下引起锁失效呢本文会以一个真实的线上案例来剖析业务处理加锁过程易使用不当的点以及对应的解决方案。 引言
多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题。
比如银行两操作员同时操作同一账户就是典型的例子。比如A、B操作员同时读取一余额为1000元的账户A操作员为该账户增加100元B操作员同时为该账户减去 50元A先提交B后提交。最后实际账户余额为1000-50950元但本该为1000100-501050。这就是典型的并发问题。
从事零售供应链库存业务对库存数量操作增减十分频繁同样存在类似上述银行取款遇到的问题库存数量操作有误势必给前台销售产生损失影响因此需要关注对库存数量并发操作下的一致性。
下面通过一个真实的案例分享在并发情况下如何保证库存数量的准确性。 问题是什么-加锁失效 看看下面这段流程和代码思考会有并发问题吗 1.加锁前获取箱子明细数据此处在锁之外存在并发脏读问题 2.加锁后并进行箱子上架分批次回传业务处理 3.加锁后更新箱子明细上架数量逻辑已上架数量 加锁前的明细数据脏读 报文回传的明细数据 直接进行行更新 原因是什么-加锁的位置不正确 核心的问题原因
1.业务分布式锁失效使用分布式锁加锁了但是仍然使用加锁前查询的数据导致出现脏读
2.Mysql锁失效数据库更新时未上任何锁导致脏读的数据直接覆盖更新当前行
有同学这时问了为啥防重码也没有生效呢
防重码主要是用作幂等逻辑的同一个请求多次处理结果仍然是相同的。
但是这是两次不同的请求防重码是不同的因此不能只依赖防重码保证一致性。 解决方案有哪些 1、代码层面使用锁如互斥锁、读写锁、分布式锁等来控制资源的访问数据获取的全部操作都需要再获取锁后才进行。
将获取箱子明细的代码移动到加锁之后只有获取到分布式锁才能执行分批次上架查询和更新串行化 对应改造后的代码 2、数据库层面实现事务管理确保数据的一致性合理设置事务隔离级别以防止脏读、或者采用乐观锁或悲观锁来处理并发更新合理设计查询效率减少锁竞争。
数据库的并发上锁处理和业务代码的上锁是互补的关系
因为无法保证后续业务的调整或其他业务代码的调用能始终保持获取数据的一致性数据库的并发上锁处理更多是一种兜底保证机制。
乐观锁更新 悲观锁更新 扩展方案
应用程序设计在应用程序设计阶段尽量避免长时间持有数据库连接或事务减少并发操作的可能性利用AI代码评审或者人工提前找出可能出现并发问题的地方合理设置锁的粒度避免锁失效。
网络负载层面采用限流控制访问频率采用分布式数据库进行数据分片降低单节点并发压力使用负载均衡将网络请求分发到不同的服务器提高系统处理并发的能力防止系统过载。
请求层面前端点击防重、系统幂等防重、尽可能降低同一请求的多次重试访问引起的一致性问题。
通过以上措施可以在不同层面有效地防止并发问题保证系统的数据的一致性。