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中的主键与事务
May 27 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL分库分表详情
Sep 25 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
PHP 调试工具Debug Tools
2011/04/30 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
三年级音乐教学反思
2014/01/28 职场文书
升学宴主持词
2014/04/02 职场文书
高中课程设置方案
2014/05/28 职场文书
服务宗旨标语
2014/07/01 职场文书
小学班主任心得体会
2016/01/07 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android