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

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

 

幻读
相同的查询语句,在事务中第二次读数据的时候,读到预期外的记录。

这里在网上看到很多说法,有的说事务隔离级别为RR(可重复读)的时候,会出现幻读,有的说RR是可以解决幻读的,下面我用一个例子,分别模拟RR模式下,不出现幻读和出现幻读的两种场景。

下面的例子,处于Mysql innodb引擎下面的默认隔离级别RR。

我们可以看到,在RR级别,先是避免了幻读,然后又发生了幻读,下面简单说明下:

在数据库的隔离级别的协议中,RR级别是可以避免提交读(即可做到重复读),但是无法避免幻读的。Mysql数据库通过MVCC(多版本并发控制)实现可重复读的,后文会简单描述下MVCC,并且可以做到一定程度上避免幻读,MVCC是快照读,假如你在这个事务中不破坏这个快照读,让它升级为当前读,那么这个事务中,是能保证可重复读,且不发生幻读的。

当你在事务中把后面的读升级为当前读的时候,则可能会出现幻读,因为以及读取到了最新的数据了,那么其他事务的提交就可能会读取出来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值