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 24 MySQL
MySQL的join buffer原理
Apr 29 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
MySQL 开窗函数
Feb 15 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
php生成zip文件类实例
2015/04/07 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
如何实现动态删除javascript函数
2007/05/27 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
React组件生命周期详解
2017/07/03 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
python实现简单的五子棋游戏
2020/09/01 Python
德国旅游网站:weg.de
2018/06/03 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
文明礼仪标语
2014/06/13 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
迎新生标语大全
2014/10/06 职场文书
婚前财产协议书范本
2014/10/19 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
商铺租房协议书范本
2014/12/04 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle