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 28 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
header跳转和include包含问题详解
2012/09/08 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
javascript中的new使用
2010/03/20 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
教你打造完美的创业计划书
2014/01/06 职场文书
活动倡议书范文
2014/05/13 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python