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:
这时,事务A要发起一次查询操作,就会生成一个ReadView
这时事务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
是60mac_trx_id
是71m_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。
来源:https://bbs.huaweicloud.com/blogs/331002
猜你喜欢
- 求字符串中最大的递增子序列数据库环境:SQL SERVER 2005如题,求字符串“abcbklmnodfghijkmer”中最大的递增子序
- 我们使用编辑器的时候,想要在其中添加一个Django项目,这样就能在里面做一些想要的操作。有些人还没有对Django进行安装,这里直接用命令
- Go 程序的性能优化及 pprof 的使用程序的性能优化无非就是对程序占用资源的优化。对于服务器而言,最重要的两项资源莫过于 CPU 和内存
- 一、检索当前目录下所有文件、文件夹from glob import globglob('./*')Output: ['
- pytest的setup与teardown1)pytest提供了两套互相独立的setup 与 teardown和一对相对自由的setup与t
- 测试:IE6、IE7、FF3.014突发奇想的效果,主要突出构思,效果还比较粗糙,好好创意一下,应该可以引申出一些比较有新意的图片切换效果。
- 前言闲暇时间抽个空写了个三国杀武将手册的小程序,中间有个需求设计的是合成武将皮肤图、竖排的武将姓名、以及小程序码,然后提供保存图片到相册,最
- 使用select @@identity 得到刚插入数据的ID1.适用于所有 ADO 版本<%Dim loConn, 
- 1. ndarray的属性数组的属性反映了数组本身固有的信息。常用的查看数组属性的相关语法如下表格所示:属性名称属性解释ndarray.sh
- 摘要:不同方法读取excel中的多个不同sheet表格性能比较# 方法1def read_excel(path): df=pd.
- 大多数程序都旨在解决最终用户的问题,为此,需要从用户那里获取一些信息。函数input()让程序暂停运行,等待用户输入一些文本。例如:name
- 在我上一篇文章,我搭了一个框架,模拟了Flask网站上“@app.route(‘/')”第一条例子的行为。如果你错过了那篇“这不是魔
- 简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取
- 一、低配logging日志总共分为以下五个级别,这个五个级别自下而上进行匹配 debug-->info-->warning--&
- SQL Server 2016 CTP2.2 安装配置教程下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe
- 0. Intro在pytorch或者其他深度学习框架中,有许多超参数需要调整,包括learning_rate,training_data_p
- 一、Selenium介绍与配置1.Selenium简介Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具
- 一,cookie和session的区别cookie在客户的浏览器上,session存在服务器上cookie是不安全的,且有失效时间sessi
- 1、打开插件市场链接:ext.dcloud.net.cn/plugin?id=2…点击红色框按钮绑定包名,这个包名与后
- 一、基础理论1、TensorFlowtensor:张量(数据)flow:流动Tensor-Flow:数据流2、TensorFlow过程Ten