MySQL RC事务隔离的实现原理

作者:?JavaEdge? 时间:2024-01-29 06:12:23 

摘要: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,虽然在ReadViewmin_trx_idmax_trx_id范围之间,但是此时并不在m_ids列表内,说明事务B在生成本次ReadView之前就已提交。说明这次你查询就可以查到事务B修改过的这个值了, 此时事务A就会查到值B。

来源:https://bbs.huaweicloud.com/blogs/331002

标签:MySQL,RC,事务,隔离
0
投稿

猜你喜欢

  • javascript常用的方法整理

    2023-08-23 10:57:13
  • sql 查询慢的原因分析

    2024-01-16 13:11:29
  • 亚马逊购物用户体验分析(三)

    2009-10-25 12:53:00
  • python with提前退出遇到的坑与解决方案

    2023-12-24 15:02:35
  • Js实现简单的小球运动特效

    2023-07-08 23:40:40
  • python解析中国天气网的天气数据

    2023-01-20 18:48:39
  • Win10环境中如何实现python2和python3并存

    2023-10-18 02:58:34
  • php 文件缓存函数

    2023-11-06 15:28:47
  • mysql属于关系型数据库吗

    2024-01-23 03:11:30
  • python字典DICT类型合并详解

    2023-01-03 07:37:12
  • python程序的打包分发示例详解

    2023-09-26 15:25:27
  • JSP实现用户登录、注册和退出功能

    2024-03-18 10:13:43
  • python itchat给指定联系人发消息的方法

    2023-02-10 18:21:36
  • Element-ui el-tree新增和删除节点后如何刷新tree的实例

    2023-07-02 17:03:52
  • php下常用表单验证的正则表达式

    2024-05-03 15:35:08
  • PyQt5打开文件对话框QFileDialog实例代码

    2022-08-10 03:38:47
  • JS从一组数据中找到指定的单条数据的方法

    2024-05-03 15:07:25
  • Python实现查询剪贴板自动匹配信息的思路详解

    2022-09-16 06:35:41
  • Django 如何使用日期时间选择器规范用户的时间输入示例代码详解

    2023-06-18 23:56:20
  • MySQL Proxy应用入门(1)--安装MySQL Proxy

    2011-03-08 09:50:00
  • asp之家 网络编程 m.aspxhome.com