《MySQL实战45讲》08 | 事务到底是隔离的还是不隔离的?

一个可重复隔离级别的事务A,另一个可重复隔离级别的事务B,A要更新B锁住的行,此时A只能进入等待状态,等A获得行锁时,要更新的数据的值是什么呢?


事务启动的两种方式

  • 一致性视图在执行第一个快照读语句时创建;
  • 一致性视图在执行start transaction with consistent snapshot 时创建。

两种视图

  • view视图:在执行查询语句时生成,为查询语句定义的虚拟表。
  • 一致性视图:InnoDB 在实现 MVCC使用的就是一致性读视图(consistent read view),用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。

举例
数据库中存有两条数据:

idk
11
22

在这里插入图片描述

  • 事务A在执行start transaction with consistent snapshot 时启动,故查询结果k=1;
  • 事务B在执行start transaction with consistent snapshot 时启动,但在执行update语句时,会再执行一次查询,此时查询结果k=2,当执行完update语句时,再执行下一条语句得到的结果k=3;
  • 事务C没有显式地使用 begin/commit,是在执行update语句时才启动。

MVCC

  • transition id:每个事务有一个唯一的事务ID,是在事务开始时生成的;
  • row trx_id:每次事务更新时,会生成一个新的数据版本,并将transition id赋值给row trx_id;
  • 一行记录可能存在多个版本,每个版本有自己的 row trx_id。
    在这里插入图片描述
    V1、V2、V3 并不是物理上真实存在的,而是每次需要的时候根据当前版本和 undo log 计算出来的。比如,需要 V2 的时候,就是通过 V4 依次执行 U3、U2 算出来。
    InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前启动了但还没提交的所有事务 ID。数组里面事务 ID 的最小值记为低水位,当前系统里面已经创建过的事务 ID 的最大值加 1 记为高水位。
    一致性视图:由视图数组和高水位组成。
    数据版本的可见性规则:row trx_id和一致性视图的对比结果。
    在这里插入图片描述
    一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:
  • 版本未提交,不可见;
  • 版本已提交,但是是在视图创建后提交的,不可见;
  • 版本已提交,而且是在视图创建前提交的,可见。

本文为《MySQL实战45讲》学习笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值