mysql中mvcc控制可重复读的问题

mysql的innodb的rr级别

事务A 事务B
start transaction
select * from user
start transaction
select * from user where id =1
update user set name ="222" where id =1
select * from user where id =1

按照mvcc的说法,事务b的id要大于事务A的id,那么事务B应该就可以读取到事务A的修改,事务b的两次select就应该不同。请问这样如何结果不可重复读的问题

阅读 3.4k
3 个回答

假设事务Aid为100,事务Bid为101。事务B生成read-view[100,101]。然后就算事务A update了数据并提交,由于事务A的id在事务B的readview中,也读取不到。

InnoDB的RR隔离级别下,事务读取的都是行数据的快照,是通过undo log实现的。事务B读取的行数据为B开始的那一刻的Version版本,所以读取的数据是一致的。与之对应的RC隔离级别下,事务读取的是最近的快照,如果事务A修改了两次,会产生不可重复读的问题、

如果 Innodb 的事务隔离级别是 RR,那么事务 B 中所读取到的 id 为 1 的记录是不会变的。因为事务 B 在执行第一次查询的时候,事务 A 并没有 COMMIT,所以 snapshot 是 update 之前的记录。可以看一下官方文档RR 的说明。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题