隔离级别+不可重复读+幻读

本文内容经过多次更新,最后重新编辑统一下。

参考资料:
MySQL InnoDB锁介绍及不同SQL语句分别加什么样的锁
InnoDB锁机制
MySQL 一致性读 深入研究
极客时间课程:mysql实战45讲

隔离级别总览:下面主要讲述RC和RR两个级别
在这里插入图片描述

1、隔离级别的特点:

隔离性正是通过锁机制来实现的。提到锁就会涉及到死锁,需要明确的是死锁的可能性并不受隔离级别的影响,因为隔离级别改变的是读操作的行为,而死锁是由于写操作产生的。

2、隔离级别的实现方式

InnoDB采用多版本并发控制(MVCC, multiversion concurrency control)来增加读操作的并发性。MVCC是指,InnoDB使用基于时间点的快照来获取查询结果,读取时在访问的表上不设置任何锁,因此,在事务T1读取的同一时刻,事务T2可以自由的修改事务T1所读取的数据。这种读操作被称为一致性非锁定读。这里的读操作就是普通SELECT。

InnoDB有两种不同的SELECT,即普通SELECT 和 锁定读SELECT。锁定读SELECT 又有两种,即SELECT … FOR SHARE 和 SELECT … FOR UPDATE;锁定读SELECT 之外的则是 普通SELECT 。

普通SELECT 时使用一致性非锁定读,不加锁;
锁定读SELECT 使用锁定读,加锁;

隔离级别为RU和Serializable时不需要MVCC,因此,只有RC和RR时,才存在MVCC,才存在一致性非锁定读。

3、MVCC的实现原理(以下参考极客时间的课程《Mysql实践45讲》)

图一
transactionId:在开始一个事务的时候生成一个transactionid,更新插入的时候把这个id记到数据中

图二

  • 开始事务之后,启动一致性视图,创建一个自身的transactionID(TID),TID在全局是按照时间递增趋势的,同时创建一个事务集合,记录当前活跃的transactionID(未commit的),并且标记其中一个最小的id(minID),一个最大的id(maxID)。
  • 在读取数据的时候,对比该数据的transactionId(KID)
  • 如果kID比minID小,那么kID代表的数据是已提交事务的,所以是可见的。其余情况下kID代表的数据不可见。就要通过图一的数据更新链接往前回溯,找到符合条件的kID代表的数据。图一数据其实就是存储在undo log中的数据。

RC级别下:每一次select操作都会重新创建一致性视图,重新生成一个transactionID,在一些文章中这种叫做每次都取最新的数快照。所以会出现不可重复读的情况。
RR级别下:只创建一次一致性视图,所以不会出现不可重复读的情况。

4、一致性视图创建时间

一致性视图在第一次一致性读select语句执行的时候创建。类似于show create table 这种操作是不会创建快照的。
从一致性视图创建的时间来看数据是否可见。
1) 版本未提交,不可见;
2) 版本已提交,但是是在视图创建后提交的,不可见;
3) 版本已提交,而且是在视图创建前提交的,可见。

5、证明隔离级别特点的例子

1)一致性视图在第一次select语句的时候创建(例子为RR级别下的情况)
在这里插入图片描述
在这里插入图片描述
2)隔离级别改变的是读操作行为,不影响更新操作(例子为RR级别下的情况)
在这里插入图片描述
更新操作总是取最新的记录去更新操作。这里其实就是出现了幻读,明明select的时候不存在id=1的记录,但是更新的时候又存在。

3)保存数据的时候将当前transactionID保存到数据记录中(例子为RR级别下的情况)
在这里插入图片描述
在这里插入图片描述
原理猜测:update id=2的时候,会将当前transactionID保存到数据记录中,即事务1的ID,按照图一的变更链应该是如下情况。
对于id=2的记录:[transaction=事务2,data] <-[transaction=事务1,data]
对于id=1的记录:[transaction=事务2,data]

当执行select id>0的时候,id=2的记录是属于当前事务更新的,所以可见,而id=1的记录是事务2的更新结果,是不可见的。所以查不到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值