【问题标题】:InnoDB x-locks in READ COMMITTED isolation levelInnoDB x-locks 在 READ COMMITTED 隔离级别
【发布时间】:2019-06-18 20:11:54
【问题描述】:

来自 MySQL 词汇表:

已提交阅读

当具有此隔离级别的事务执行 UPDATE ... WHERE 或 DELETE ... WHERE 操作时,其他事务可能需要等待。该事务可以执行 SELECT ... FOR UPDATE 和 LOCK IN SHARE MODE 操作无需让其他事务等待

对吗?

UPDATE 为它扫描的每一行设置 x 锁,然后释放那些与 WHERE 部分不匹配的锁。剩余的行保持 x 锁直到事务结束。据我所知,SELECT-FOR UPDATE 会发生完全相同的事情。那么 UPDATE 怎么会阻塞其他事务而 SELECT-FOR UPDATE 不会呢?

【问题讨论】:

    标签: mysql select transactions sql-update read-committed


    【解决方案1】:

    词汇表不准确。

    SELECT FOR UPDATEUPDATE 一样获得 X 锁。在这两种情况下,其他需要任何类型锁的事务都必须等待。

    SELECT FOR SHARE(或LOCK IN SHARE MODE)获得一个 S 锁。其他需要S锁的事务可以拿到,但是其他需要X锁的事务需要等待。

    事务隔离级别与需要的锁关系不大,只是当你的事务使用READ-COMMITTED时某些类型的间隙锁是不需要的。

    似乎词汇表有点被忽视了。最好阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.htmlhttps://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 2014-09-18
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 2012-07-04
      • 2021-01-30
      • 2011-04-22
      • 1970-01-01
      相关资源
      最近更新 更多