使用可重复读取隔离时 SELECT .. FOR UPDATE 有什么用?

Whats the use of SELECT .. FOR UPDATE when using Repeatable Read isolation?

使用可重复读取隔离时,可以保证您使用 SELECT 读取的行在事务完成之前不会被修改。

这似乎与 SELECT.. FOR UPDATE 优惠相似。

那么在使用可重复读取隔离时使用 SELECT FOR UPDATE 有什么意义呢?

当您在 Repeatable Read 下读取记录时,您会获得读锁,但其他事务也可以获得读锁,这可能会阻止您稍后进行更新。使用 FOR UPDATE 通知任何其他请求读取锁定的事务,它们应该等到您完成更新记录。

可能有问题。

当您在不使用 FOR UPDATE 的情况下读取可重复读取下的记录时,Mysql 使用 Consistent Nonlocking Reads 进行读取。它不会对其创建任何锁定。

使用 FOR UPDATE 将创建写锁。


不使用 FOR UPDATE 的可重复读取:从该事务中第一次读取建立的快照中读取数据。

使用 FOR UPDATE:读取新的快照。它可以读取提交的最新数据。即使您使用的是可重复读取隔离级别,它的行为也像“READ COMMITTED”。


此外,如果您创建事务 A 并在一行上使用 FOR UPDATE。像这样。

BEGIN;
select * from hero where id=3 for update ;

然后你再创建一个事务B,做一个简单的读取。

BEGIN;
select * from hero where id=3 ;

事务B使用非锁定读,不会检查行上是否存在写锁。它不会阻塞。