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 update set 和 and的区别
May 08 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
如何使用分区处理MySQL的亿级数据优化
Jun 18 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
mysql的数据压缩性能对比详情
Nov 07 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
pt-archiver 主键自增
Apr 26 MySQL
优化Mysql查询的示例
Apr 26 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
你真的会用Mysql的explain吗
MySQL限制查询和数据排序介绍
MySQL学习必备条件查询数据
mysql中数据库覆盖导入的几种方式总结
Mysql如何实现不存在则插入,存在则更新
Mar 25 #MySQL
You might like
PHP 地址栏信息的获取代码
2009/01/07 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
php查询操作实现投票功能
2016/05/09 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
一个选择最快的服务器转向代码
2009/04/27 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
vue实现文字加密功能
2019/09/27 Javascript
Python列表推导式的使用方法
2013/11/21 Python
python图像处理之镜像实现方法
2015/05/30 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
零基础小白多久能学会python
2020/06/22 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
酒吧总经理岗位职责
2013/12/10 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技