说明:
该场景为商品库存操作更新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