01.25 Day 6 - InnoDB 的事务和锁

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 6 天,也是我第 47 次进行这种操作。

今天我温习了该专栏里一篇叫《事务到底是隔离的还是不隔离的?》的文章。

关键词总结:事务启动时机、MySQL 两个 “视图” 的概念、“快照” 在 MVCC 里是怎么工作的?(数据版本 row trx_id 的几种可能、对事务视图来说的数据版本)、更新逻辑(读提交和可重复读的区别)。

所学总结:

事务启动时机

  • 第一种启动方式,执行第一个快照读语句时创建一致性视图;
  • 第二种启动方式,执行 start transaction with consistent snapshot 时创建一致性视图。

MySQL 两个 “视图” 的概念

  • View 视图:通过查询语句定义的虚拟表,调用时执行查询语句并生成结果。语法是 create view … ,它的查询方法与表一样;
  • Consistent Read 视图:InnoDB 在实现 MVCC 时用的一致性读视图,以支持读提交(RC,Read Committed)以及可重复读(RR,Repeatable Read)隔离级别的实现。
     

“快照” 在 MVCC 里是怎么工作的?

InnoDB 里每个事务有一个唯一的事务 ID,叫 transaction id。它是由事务开始时向 InnoDB 事务系统申请的,按申请顺序严格递增。
每行数据有多个版本。每次事务更新数据时,生成一个新的数据版本,并将 transaction id 赋予数据版本的事务 ID,也就是 row trx_id。保留旧数据版本,新数据版本中能直接获取它。

数据版本 row trx_id 的几种可能

  • 在已提交事务(低水位):该版本是已提交或当前事务所生成的,该数据是可见的;
  • 未开始事务(高水位):该版本是将来启动事务所生成的,该数据不可见;
  • 未提交事务集合(当前事务):两种情况:
  • row trx_id 在数组中:该版由还未提交的事务所生成,不可见;
  • row trx_id 不在数组中:该版由已提交事务所生成,可见。

对事务视图来说的数据版本

  • 版本未提交:不可见;
  • 版本已提交:在视图创建后提交的,不可见;
  • 版本已提交:在视图创建前提交的,可见。
     

更新逻辑

读提交和可重复读的区别

  • 可重复读隔离级别:事务开始时创建一致性视图,之后事务的其他查询共用该一致性视图;
  • 读提交隔离级别:语句执行前会重新计算一个新视图。

末了

重新总结了一下文中提到的内容:InnoDB 行数据有多个版本、数据版本有自己的 row trx_id、事务或语句有自己的一致性视图、普通查询语句是一致性读、一致性读会根据 row trx_id 和一致性视图确定数据版本可见性、可重复读查询认可在事务启动前就提交的数据、读提交查询认可在语句启动前就提交的数据。

发布了84 篇原创文章 · 获赞 6 · 访问量 2245

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104082489