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 30 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
优化Mysql查询的示例
Apr 26 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
python正则表达式中的括号匹配问题
2014/12/14 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
查看Django和flask版本的方法
2018/05/14 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
python的pip安装以及使用教程
2018/09/18 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
应届毕业生自荐信
2014/05/28 职场文书
承租经营合作者协议书
2014/10/01 职场文书
大学辅导员述职报告
2015/01/10 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android
Python中tqdm的使用和例子
2022/09/23 Python