MySQL InnoDB是否会并行更新字段的问题

在MySQL中使用InnoDB引擎的表,不使用锁,下面的SQL

UPDATE table_name SET remain_count = remain_count - 1 WHERE ... AND remain_count > 0;

remain_count是1时,会不会并行执行两条上面语句,把remain_count减成-1呢。

阅读 5.1k
2 个回答

不会,单条 UPDATE 语句是对于某一行记录而言是原子的,始终不可能减成 -1。

你这单条的update语句其实利用的是【乐观锁】,update对于某一行记录是原子性操作的,会自动加锁的,所以是安全的。

但如果你是这样的:

if (select …… where remain_count > 0) {
   update ……     
}

即:

  1. select
  2. update

那么就会有并发问题了,就会出现库存减成负数了。

这样只能通过对1语句加行锁了:

  1. select …… where remain_count > 0 for update

这也就是悲观锁。

其他:所有的并发问题,都是对资源的抢占、争夺而引起的问题。如果不控制解决,可能就会造成非常严重的后果BUG,而所有的解决办法其实就是,将关键的部分变为串行。也就是对资源加锁,锁的种类一般有两种:锁有悲观锁和乐观锁两种。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题