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就应该不同。请问这样如何结果不可重复读的问题
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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
的说明。