在使用可重复读取隔离时,使用SELECT .. FOR UPDATE是什么意思?

时间:2015-11-18 16:03:15

标签: mysql sql concurrency transactions percona

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

这似乎与SELECT .. FOR UPDATE提供的相似。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

也许有问题。

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

使用FOR UPDATE将创建写锁。


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

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


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

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

然后创建另一个事务B并进行简单的阅读。

BEGIN;
select * from hero where id=3 ;

事务B使用Nonlocking-Read,并且不会检查行上是否存在写锁。它不会阻止。