从MySQL词汇表:
读取已提交
具有此隔离级别的事务执行UPDATE ... WHERE或DELETE ... WHERE操作时,其他事务可能必须等待。事务可以执行SELECT ... FOR UPDATE和LOCK IN SHARE MODE操作,而无需等待其他事务。
对吗?
UPDATE将x锁设置到它扫描的每一行,然后释放与WHERE部分不匹配的那些锁。其余行保持x锁,直到事务结束。据我所知,SELECT-FOR UPDATE会发生完全相同的事情。那么UPDATE可能会阻止其他事务但SELECT-FOR UPDATE不会阻止其他事务吗?
答案 0 :(得分:1)
词汇表不准确。
SELECT FOR UPDATE
会像UPDATE
一样获得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和https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html