数据无法修改?解密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介绍

posted @ 2020-06-29 11:29  IUNI_JM  阅读(251)  评论(0编辑  收藏  举报