在研究并发请求商品超售问题时,测试了几种 MySQL 的 sql 语句,其中一种情况产生死锁的问题很困惑,求大佬指点。
SQL 语句
UPDATE inventory SET stock = stock - Y WHERE product_id = X AND stock >= Y;
product_id
主键索引,此语句本意想避免超售,即 stock 库存不能为负。对比 SQL
// 事务中,先对库存加锁 for update ,避免其他事务修改库存
SELECT stock FROM inventory WHERE product_id = X FOR UPDATE;
// 再进行修改
UPDATE inventory SET stock = stock - Y WHERE product_id = X;
请教下第一种 sql 是什么原因造成的死锁?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.