数据无法修改?解密MVCC原理
问题
事务隔离级别是可重复读,表结构如下:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, c) values(1,1),(2,2),(3,3),(4,4);
什么场景会出现下面修改失效的问题?
场景
对于下面的两个并发事务,就会出现上面的问题。
原因
B更新表t之后,会将表t上所有记录的trx_id修改为B的trx_id,而A在执行update的时候数据已经被B修改了,条件不满足,update失败。然后执行select,这时表t中所有记录的trx_id都是B的,相对于A的ReadView来说,B属于未来事务,所以A看不到,查出来的还是事务开始时的数据。
这个现象本身不就说明了MVCC解决了可重复读的问题吗?
ReadView多版本的判断可以参考:ReadView介绍