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 06 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
将MySQL的表数据全量导入clichhouse库中
Mar 21 MySQL
浅谈MySQL中的六种日志
Mar 23 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
可插入图片的TEXT文本框
2013/12/27 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
python的类方法和静态方法
2014/12/13 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python常见异常分类与处理方法
2017/06/04 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
python 线程的五个状态
2020/09/22 Python
Python实现壁纸下载与轮换
2020/10/19 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
机械专业应届生求职信
2013/09/21 职场文书
小学母亲节活动总结
2015/02/10 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
Pandas-DataFrame知识点汇总
2022/03/16 Python
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
Python PIL按比例裁剪图片
2022/05/11 Python