MVCC快照读《通过数据版本使数据库的事务读写不用加锁就可以保证事务的一致性》
事务隔离级别《提交读和可重复读的事务隔离级别作用的数据范围则分别对应不同的快照版本范围》
通过以上两种机制的结合实现InnoDB事务下的高并发性。
例题:InnoDB表:t(id PK, name)表中有三条记录:
1, shenjian
2, zhangsan
3, lisi
case:两个并发事务A,B执行的时间序列如下(A先于B开始,B先于A结束):
A1: start transaction;
B1: start transaction;
A2: select * from t;
B2: insert into t values (4, wangwu);
A3: select * from t;
B3: commit;
A4: select * from t;
提问1:假设事务的隔离级别是可重复读RR,事务A中的三次查询,A2, A3, A4分别读到什么结果集?
回答:RR下
(1)A2读到的结果集肯定是{1, 2, 3},这是事务A的第一个read,假设为时间T;
(2)A3读到的结果集也是{1, 2, 3},因为B还没有提交;
(3)A4读到的结果集还是{1, 2, 3},因为事务B是在时间T之后提交的,A4得读到和A2一样的记录;
提问2:假设事务的隔离级别是读提交RC,A2, A3, A4又分别读到什么结果集呢?
回答:RC下
(1)A2读到的结果集是{1, 2, 3};
(2)A3读到的结果集也是{1, 2, 3},因为B还没有提交;
(3)A4读到的结果集还是{1, 2, 3, 4},因为事务B已经提交;
注:本来只有串读隔离级别才可以解决幻读问题,而这里的可重复读感觉也解决了幻读问题,是因为innodb默认为它加入了间隙锁,防止在事务期间对相关数据集插入记录。