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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python3.6数独问题的解决
2019/01/21 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
django中cookiecutter的使用教程
2020/12/03 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
android面试问题与答案
2016/12/27 面试题
水电工岗位职责
2014/02/12 职场文书
担保书格式
2015/01/20 职场文书
单位工资证明范本
2015/06/12 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
php修改word的实例方法
2021/11/17 PHP
Golang 入门 之url 包
2022/05/04 Golang