MySQL RC事务隔离的实现


Posted in MySQL onMarch 31, 2022

摘要:Read Committed事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读、幻读问题。ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:若为事务自己更新的数据,自己可以读到或在你生成ReadView之前提交的事务所修改的值,也可读到但若你生成ReadView时,就已经活跃的事务,但如果它在你生成Read...

ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:

  • 若为事务自己更新的数据,自己可以读到
  • 或在你生成ReadView之前提交的事务所修改的值,也可读到
  • 但若你生成ReadView时,就已经活跃的事务,但如果它在你生成ReadView之后修改的数据并提交了,此时你读不到
  • 或你生成ReadView以后再开启的事务修改了数据,还提交了,也读不到

所以上面那套机制就是ReadView的一个原理如何基于ReadView实现RC?核心设计:当一个事务设置RC,他是每次发起查询,都重新生成一个ReadView!

数据库里有一行数据,是事务id=50的一个事务,很久以前就插入的,当前活跃事务:

  • 事务A(id=60)
  • 事务B(id=70)

现在事务B发起update,更新这条数据为b,所以此时数据的trx_id会变为事务B的id=70,同时生成一条undo log:

MySQL RC事务隔离的实现

这时,事务A要发起一次查询操作,就会生成一个ReadView

MySQL RC事务隔离的实现

这时事务A发起查询,发现当前这条数据的trx_id=70。即属于ReadView的事务id范围之间,说明是他生成ReadView之前就有这个活跃的事务,是这个事务修改了这条数据的值,但此时事务B还没提交,所以ReadView的m_ids活跃事务列表里,有[60, 70]两个id,此时根据ReadView机制,事务A无法查到事务B修改的值b。

接着就顺着undo log版本链条往下查找,就会找到一个原始值,发现其trx_id是50,小于当前ReadView里的min_trx_id,说明是他生成ReadView之前,就有一个事务插入了这个值并且早就提交了,因此可以查到这个原始值。

接着,假设事务B提交,提交了就说明事务B不会活跃于数据库里了。事务A下次再查询,就可以读到事务B修改过的值了。那到底是怎么让事务A能够读到提交的事务B修改过的值呢?

让事务A下次发起查询,再生成一个ReadView,数据库内活跃的事务只有事务A,因此:

  • min_trx_id是60
  • mac_trx_id是71
  • m_ids=60,事务B的id=70不会出现在m_ids活跃事务列表

此时事务A再次基于这个ReadView去查询,会发现这条数据的trx_id=70,虽然在ReadView的min_trx_id和max_trx_id范围之间,但是此时并不在m_ids列表内,说明事务B在生成本次ReadView之前就已提交。说明这次你查询就可以查到事务B修改过的这个值了, 此时事务A就会查到值B。

到此这篇关于MySQL RC事务隔离的实现的文章就介绍到这了,更多相关MySQL RC事务隔离内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
详解MySQL的内连接和外连接
May 08 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
php 常用类整理
2009/12/23 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
python help函数实例用法
2020/12/06 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
仓库管理专业个人的自我评价
2013/12/30 职场文书
区三好学生主要事迹
2014/01/30 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
家长学校培训材料
2014/08/20 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL
MySQL 字符集 character
2022/05/04 MySQL
PHP RabbitMQ消息列队
2022/05/11 PHP