MVCC快照读&事务隔离级别&当前读

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010243114/article/details/82382075

MVCC快照读《通过数据版本使数据库的事务读写不用加锁就可以保证事务的一致性》
事务隔离级别《提交读和可重复读的事务隔离级别作用的数据范围则分别对应不同的快照版本范围》
通过以上两种机制的结合实现InnoDB事务下的高并发性。

注:本来只有串读隔离级别才可以解决幻读问题,而实际上由于快照读的特性使可重复读也解决了幻读问题。

注:当前读是因为innodb默认为它加入了间隙锁,防止在事务期间对相关数据集插入记录,从而避免出现幻读。

使用场景:

1. 快照读(snapshot read)

简单的select操作(不包括 select ... lock in share mode, select ... for update)

2.当前读(current read)

select ... lock in share mode

select ... for update

insert

update

delete

注:在RR级别下,快照读是通过MVVC(多版本控制)和undo log来实现的,当前读是通过加record lock(记录锁)和gap lock(间隙锁)来实现的。如果需要实时显示数据,还是需要通过手动加锁来实现。这个时候会使用next-key技术来实现。

注:在mysql中,提供了两种事务隔离技术,第一个是mvcc,第二个是next-key技术。这个在使用不同的语句的时候可以动态选择。不加lock inshare mode之类的快照读就使用mvcc。否则 当前读使用next-key。mvcc的优势是不加锁,并发性高。缺点是不是实时数据。next-key的优势是获取实时数据,但是需要加锁。


例题: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已经提交;

猜你喜欢

转载自blog.csdn.net/u010243114/article/details/82382075