首页 > 数据库 >【解决方案】MySQL死锁解决案例

【解决方案】MySQL死锁解决案例

时间:2023-05-04 18:36:33浏览次数:42  
标签:库存 组合 解决方案 更新 订单 死锁 MySQL 单品

说明:

该场景为商品库存操作更新MySQL时发生的数据库死锁,如果你没有做过库存系统经验,也可以把方案应用到(优惠券库存or活动库存or抽奖礼品库存等等),只要符合同时更新多条记录时均可。

背景:

库存系统组合品是由多个单品组合而成,更新数据库时先组装数据再批量更新多个sku。

组合品关系的数据结构为:(组合品单品关系顺序由绑定组合品关系时选中传入顺序决定)

{
    "combineSku":"组合品A",
    "combineRelation":[
             {
                   "单品a":"单品数量1"
             },{
                   "单品b":"单品数量2"
             },{
                   "单品c":"单品数量3"
             },
    ]
}

死锁发生场景:

存在两个组合品 组合品A=1a+2b+3c; 组合品B=2c+3b+1d;

当一个订单购买组合品A,另一个订单购买组合品B,更新数据库组装数据结果为:

订单1.组合品A+单品1a+单品2b+单品3c

订单2.组合品B+单品2c+单品3b+单品1d

当两个订单同时更新数据库时,发生单品b和单品c的数据死锁,订单1等待订单2释放单品c,订单2等待订单1释放单品b。

解决方案

组装数据时,按照sku进行排序,得到排序后结果为:

订单1.组合品A+单品1a+单品2b+单品3c

订单2.组合品B+单品3b+单品2c+单品1d

死锁问题解决。

总结

解决死锁不一定非要炫技,死锁发生的根本原因其实就是加锁顺序不同导致的锁竞争,所以只要变成有序加锁,就避免了锁竞争的产生,也就解决了死锁的问题。

不管黑猫白猫,抓到耗子就是好猫。

标签:库存,组合,解决方案,更新,订单,死锁,MySQL,单品
From: https://www.cnblogs.com/geek233/p/17372160.html

相关文章

  • rpm升级mysql小版本
    记录一下升级mysql小版本遇到坑的过程,由于数据量比较多,因此备份时最大的几个表没有备份(备份了数据文件.idb文件),但是有一个表没有备份到,导致后面浪费很久的时间恢复数据正确的升级命令如下:rpm-Uvhmysql-community-common-5.7.41-1.el7.x86_64.rpm rpm-Uvhmysql-community-li......
  • MySQL 8.0中InnoDB buffer pool size进度更透明
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:Yejinrong/叶金荣文章来源:GreatSQL社区原创MySQL8.0upupup~从MySQL5.7开始,支持在线动态调整innodbbufferpool,并为此新增了一个状态变......
  • MySQL(十八)MySQL事务(一):事务的概述与使用
    MySQL事务(一):事务的概述与使用1数据库事务概述​ 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。1.1存储引擎支持情况​ show......
  • 5、MySQL的SQL语言、数据库管理、数据类型及DQL的单、多表查询
    进入mysql后,使用help列出的是客户端的命令,使用helpcontents列出服务端命令SQL语句分类(DDLDMLDQL要记住)前三个重要(DDL、DML、DQL、DCL、TCL)DDL:DataDefinationLanguage数据定义语言CREATE,DROP,ALTER(对数据库、表、视图、索引进行创建、删除和更改的工具ALTER改格式)......
  • MySQL事务
    前序原文链接1:https://cloud.tencent.com/developer/article/1899373MySQL有9种存储引擎,不同的引擎,适合不同的场景,常用引擎为InnoDB,它是MySQL的默认存储引擎。登录MySQL,执行showengines可以查询MySQL支持的存储引擎,如图示:1、InnoDB引擎(1)它事务型数据库的首选引擎,支持事务安全表(AC......
  • github push 要求密码,但是密码已经弃用的解决方案
    参考资料:https://bobbyhadz.com/blog/support-for-password-authentication-was-removed-on-august 1.创建githubpersonalaccesstokenVisit https://github.com andintheupper-rightcorner,clickonyourprofilepictureandthenclick Settings.Inthel......
  • docker mysql 容器自动停止 -- docker update
    原因:mysql容器占用资源过高被系统杀死解决方法dockerupdate-m500M--memory-reservation500M--memory-swap1000M容器id/容器名说明-m限制内存最大值--memory-reservation是弹性控制内存大小,防止损失性能,建议要开。当宿主机资源充足时,允许容器尽量多地使......
  • PHP基础--mysqli的事务处理
    <?php//在命令行中:默认创建的表类型为MyISAM表类型,是不支持事务的//在命令行中建表时添加type=InnoDB,默认自动提交事务autocommit,不能回滚//创建连接对象$mysqlConn=newmysqli("localhost","root","root","test");if($error=$mysqli->connect_error){die("......
  • mysql - shell 执行 sql 文件有中文乱码-解决
    1.背景执行  发现部分中文乱码2.解决在执行sql语句之前,加入下面指令即可SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0; ......
  • MySQL 8.0半同步复制-net_flush()失败
    MySQL8.0.26做的增强半同步复制,log-error日志中出现如下报错:2021-12-28T14:04:24.663005+08:0011[ERROR][MY-011161][Repl]Semi-syncmasterfailedonnet_flush()beforewaitingforreplicareply.2021-12-28T14:51:49.217811+08:00413824[ERROR][MY-011161][Repl......