如何实现MySQL InnoDB事务隔离级别?

发布时间:2020-05-23 17:55:00 作者:鸽子
来源:亿速云 阅读:432

今天介绍下,在 MySQL 的 InnoDB 存储引擎中,事务隔离是如何实现的。

InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnoDB 的事务系统申请的,是按申请顺序严格递增的。

对于数据库的每行记录,都会有三个隐藏字段:db_trx_id (事务 id)db_roll_pt (回滚指针)delete_flag(删除标记)。— 有懂的朋友,还望别细纠,其实 delete_flag 是在头信息中,这里是为了方便理解

对于 DML 操作来说:

我们会用此语句建表及初始化数据,用于下面举例:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `k` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

insert into t(id, k) values(1, 1);

数据初始状态为:

如何实现MySQL InnoDB事务隔离级别?

Repeatable Read 可重复读

如当前的隔离界别为 Repeatable Read ,下面是 SQL 的执行过程:

如何实现MySQL InnoDB事务隔离级别?

那么对于第 8,10,12,13 行来说,查询的结果应该是什么呢?

结果应该分别是:2,1,3,1 。

下面我们来逐步回放,MySQL 底层是如何实现这整个过程的:

如何实现MySQL InnoDB事务隔离级别?

此时会根据查询规则,进行查找,规则如下:

  1. 如果数据的 db_trx_id < min id ,则说明数据在开启当前事务前已提交的,内容可见。

  2. 如果数据的 db_trx_id > max id ,则说明数据在此事务启动后生成的,内容不可见。

  3. 如果数据的 min id <= db_trx_id <= max id ,则还分为两种情况:

    3.1 若 db_trx_id 在 read view 的数组中,表示这个版本是由还没提交的事务生成的,不可见,但如果是自己的事务,则可见。

    3.2. 若不在数据中,则表示这个版本是已经提交了的事务生成的,可见。

示意图如下:

如何实现MySQL InnoDB事务隔离级别?

当前的事务的一致性视图为 read view: [100, 101] ,max id: 103,那么根据这个规则,在上面的数据链中查询数据,从最新的蓝色,开始找,找到第一个数据的 db_trx_id 为 102,符合规则 3.2 属于可见范围,查询结果为 2。

如何实现MySQL InnoDB事务隔离级别?

Read Committed 读已提交

处于 Read Committed 读已提交 也可套用上面的规则,不过一致性视图: read view 和 max id 的创建时机,是每一条 select 语句时重新生成。你根据上面的内容,可以自己动手试验下读已提交。

推荐阅读:
  1. MySQL InnoDB 事务
  2. MySQL的又一神器-锁,MySQL面试必备

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql mysql innodb 如何实现

上一篇:在线游戏可以用哪些编程语言实现?

下一篇:​什么是iOS开发?怎么学习iOS?

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》