【解决方案】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

死锁问题解决。

总结

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

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

posted @ 2023-05-04 18:24  Micky233  阅读(19)  评论(0编辑  收藏  举报