update goods set good_num = good_num-1 where id = 37662;
在InnoDB引擎下,数据库执行上面sql语句时,理论上执认为是执行单条语句的事务 ,执行时会自动加写锁, 那么 在并发情况下, 大量执行了上面的sql语句后, 为何会出现超卖?
update goods set good_num = good_num-1 where id = 37662 and good_num>=1
这样行吗
不行,100个库存会卖出订单商品数量累计超出100以上 , 依然会出现负数情况
建议在应用中控制并发。
在后端代码中怎么控制并发?
@信仰沉思: 比如根据你这个id加锁,同一时间只允许一个线程执行关于id为37662的update语句。
如果分布式系统,就用分布式锁。
@保镖: 不是用的数据库的读写锁?
@信仰沉思: 应用比数据库好控制。
@信仰沉思: 可以看看读写锁
@保镖: 对应用层的锁目前不了解, 现在在疑惑数据库写锁的原理
大量执行是指并发执行吗?系统是分布式的吗?
– 哎哟,不错哦 4年前@哎哟,不错哦: 并发执行,不是分布式的
– 信仰沉思 4年前@信仰沉思: 一:调整数据库的隔离级别
– 哎哟,不错哦 4年前二:update 语句加上代码块锁
推荐使用第二种方案
@哎哟,不错哦: 不能改隔离级别,单条的update自动会加锁
– 信仰沉思 4年前@信仰沉思: update语句更新的时候是行级锁,如果这样不满足的话建议代码加锁
– 哎哟,不错哦 4年前@哎哟,不错哦:现在主要是疑惑行级锁写锁不应该出现超卖。原因是什么
– 信仰沉思 4年前@信仰沉思: 和隔离级别有关系并发情况下不建议使用数据库的锁来控制
– 哎哟,不错哦 4年前