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 13 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
mysql序号rownum行号实现方式
Dec 24 MySQL
mysql数据库如何转移到oracle
Dec 24 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
mysql5详细安装教程
2007/01/15 PHP
PHP mkdir()定义和用法
2009/01/14 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
研究生求职推荐信范文
2013/11/30 职场文书
12月红领巾广播稿
2014/02/13 职场文书
《最可爱的人》教学反思
2014/02/14 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
股东授权委托书
2014/10/15 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
商业计划书范文
2019/04/24 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python