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

什么场景会出现下面修改失效的问题?

数据无法修改?解密MVCC原理

场景

对于下面的两个并发事务,就会出现上面的问题。

数据无法修改?解密MVCC原理

原因

B更新表t之后,会将表t上所有记录的trx_id修改为B的trx_id,而A在执行update的时候数据已经被B修改了,条件不满足,update失败。然后执行select,这时表t中所有记录的trx_id都是B的,相对于A的ReadView来说,B属于未来事务,所以A看不到,查出来的还是事务开始时的数据。

ReadView多版本的判断可以参考:ReadView介绍

数据无法修改?解密MVCC原理

上一篇:将项目上传到gitee


下一篇:JS和JSP的区别