2

来自 MySQL 词汇表:

阅读已提交

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

那是对的吗?

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

4

1 回答 1

1

词汇表不准确。

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

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

于 2019-01-25T01:33:11.117 回答