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优化
Apr 06 MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
mysql脏页是什么
Jul 26 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
关于mysql中时间日期类型和字符串类型的选择
Nov 27 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
我的论坛源代码(七)
2006/10/09 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
php使用正则验证中文
2016/04/06 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python多进程编程技术实例分析
2014/09/16 Python
Python使用MONGODB入门实例
2015/05/11 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
python3 线性回归验证方法
2019/07/09 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Django如何实现防止XSS攻击
2020/10/13 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
优秀民警事迹材料
2014/01/29 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
如何理解及使用Python闭包
2021/06/01 Python
Redis中一个String类型引发的惨案
2021/07/25 Redis
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python