在MySQL中使用InnoDB引擎的表,不使用锁,下面的SQL
UPDATE table_name SET remain_count = remain_count - 1 WHERE ... AND remain_count > 0;
当remain_count
是1时,会不会并行执行两条上面语句,把remain_count
减成-1呢。
在MySQL中使用InnoDB引擎的表,不使用锁,下面的SQL
UPDATE table_name SET remain_count = remain_count - 1 WHERE ... AND remain_count > 0;
当remain_count
是1时,会不会并行执行两条上面语句,把remain_count
减成-1呢。
你这单条的update
语句其实利用的是【乐观锁】,update
对于某一行记录是原子性操作的,会自动加锁的,所以是安全的。
但如果你是这样的:
if (select …… where remain_count > 0) {
update ……
}
即:
那么就会有并发问题了,就会出现库存减成负数了。
这样只能通过对1语句加行锁了:
select …… where remain_count > 0 for update
。这也就是悲观锁。
其他:所有的并发问题,都是对资源的抢占、争夺而引起的问题。如果不控制解决,可能就会造成非常严重的后果BUG,而所有的解决办法其实就是,将关键的部分变为串行。也就是对资源加锁,锁的种类一般有两种:锁有悲观锁和乐观锁两种。
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.2k 阅读✓ 已解决
2 回答2k 阅读
3 回答2k 阅读
不会,单条
UPDATE
语句是对于某一行记录而言是原子的,始终不可能减成 -1。