使用可重复读取隔离时,可以保证在事务完成之前,不会修改使用SELECT读取的行。
这似乎与SELECT .. FOR UPDATE提供的相似。
那么在使用可重复读取隔离时使用SELECT FOR UPDATE有什么意义呢?
答案 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,并且不会检查行上是否存在写锁。它不会阻止。