InnoDB x-locks in READ COMMITTED 隔离级别

InnoDB x-locks in READ COMMITTED isolation level

来自MySQL词汇表:

READ COMMITTED

When a transaction with this isolation level performs UPDATE ... WHERE or DELETE ... WHERE operations, other transactions might have to wait. The transaction can perform SELECT ... FOR UPDATE, and LOCK IN SHARE MODE operations without making other transactions wait.

对吗?

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

词汇表不准确。

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.html and https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html