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 8.0.24 安装配置方法图文教程
May 12 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
mysql主从复制的实现步骤
Oct 24 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
python fabric使用笔记
2015/05/09 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
pytorch中的inference使用实例
2020/02/20 Python
如何让python的运行速度得到提升
2020/07/08 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
移动通信行业实习自我鉴定
2013/09/28 职场文书
自我鉴定范文200字
2013/10/02 职场文书
优秀员工年终发言演讲稿
2014/01/01 职场文书
火车的故事教学反思
2014/02/11 职场文书
大学军训感想
2014/02/12 职场文书
车间主任岗位职责
2015/02/03 职场文书
烈士陵园观后感
2015/06/08 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android