MySQL数据库事务各隔离级别加锁情况--read committed && MVCC
之前已经转载过几篇相关的文章,此次基于mysql 5.7 版本,从测试和源码角度解释一下RR,RC级别为什么看到的数据不一样
先补充一下基础知识
基本知识
假设对于多版本(MVCC)的基础知识,有所了解。InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议。
行结构
InnoDB表数据的组织方式为主键聚簇索引。由于采用索引组织表结构,记录的ROWID是可变的(索引页分裂的时候,Structure Modification Operation,SMO),因此二级索引中采用的是(索引键值, 主键键值)的组合来唯一确定一条记录。
无论是聚簇索引,还是二级索引,其每条记录都包含了一个DELETED BIT位,用于标识该记录是否是删除记录。除此之外,聚簇索引记录还有两个系统列:DATA_TRX_ID,DATA_ROLL_PTR。DATA _TRX_ID表示产生当前记录项的事务ID;
DATA _ROLL_PTR指向当前记录项的undo信息。
开启4个mysql客户端,client1 用来查看数据情况 , client2,client3,client4 更新数据
表结构
所有client 启动事务
执行 show engine innodb status\G , 观察目前的事务信息
这里可以看到目前没有任何活动事务(select 不产生任何活动事务,只有insert ,update,delete 才会产生活动事务)
我们先在client2 执行一个insert sql,然后再在client1 看事务信息
我们可以看到client2 产生了12654 的活动事务, 我们继续再client3执行sql
client3 产生了一个12659的事务
我们从截图的角度看这2个事务
12659 -- 这是物理位置比较高的事务, mysql 本身里有专有名词叫 low_limit_id ,高水位
12654 --这是物理位置比较低的事务, up_limit_id ,低水位
接下来我们在client1 执行select查询
client2,client3还没有提交,这时候client1 只能获取到以前的旧数据
这时候client2,client3提交,再在client1查询
重点来了,这时候mysql产生了一份快照,这里叫read_view, 快照的结构是
read_view->creator_trx_id = 当前client1的事务id;
read_view->up_limit_id = 12654;
read_view->low_limit_id = 12659;
read_view->trx_ids = [12654,12659];
read_view->m_trx_ids = 2;
接下来,我们在client4执行insert操作,并马上commit提交,然后再在client1执行select查询
我们可以看到client4的修改虽然已经提交,但是client1还是看不到这个变化,那是因为:
low_limit_id; /* 索引数据事务号 DATA_TRX_ID >= low_limit_id的记录,对于当前Read View都是不可见的 */
up_limit_id; /* 索引数据事务号 DATA_TRX_ID< up_limit_id ,对于当前Read View都是可见的 */
刚才client4修改的时候产生的事务id是比12659还要大的一个数字, 没有查看,不知道具体数字,我们假设是12700这个数字
当产生read-view的时候, low_limit_id 是 12659,up_limit_id 是12654, 12700>12659 & 12654, 所以这些12654,12659对于那个read-view来说是看不见的
如果在client1 select 产生read-view 之前就执行client4的修改(和提交, 这时候client4的事务id, 我们假设就是一个比12654小的数字,如12600),12600<12654, 所以client4的修改对于当前read-view就是可视的
我们看看源码 read0types.h
那为什么事务隔离级别是RC级别的时候,重复上面的操作步骤, client1在client2,client3提交后select 的时候,就能马上查询到修改
我们看源码
ha_innodb.cc的ha_innobase::external_lock方法里
在RC级别的时候,每次都会关闭read-view并产生一份新的
MySQL数据库事务各隔离级别加锁情况--read committed && MVCC的更多相关文章
- MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)
http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...
- MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转)
本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理 ...
- MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)
本文转自https://m.imooc.com/article/details?article_id=17289 感谢作者 上节回顾 上两篇记录了我对MySQL 事务 隔离级别read uncommi ...
- MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)
本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解 ...
- Mysql数据库事务的隔离级别和锁的实现原理分析
Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...
- Mysql数据库事务及隔离级别学习测试
参考了这篇文章的一些内容: http://xm-king.iteye.com/blog/770721 记住以下这张表: 我在springdemo库里面建了一个表: CREATE TABLE `tx` ...
- 「DB」数据库事务的隔离级别
*博客搬家:初版发布于 2017/04/10 00:37 原博客地址:https://my.oschina.net/sunqinwen/blog/875833 数据库事务的隔离级别 讲事务的隔离 ...
- Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别
Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...
- 数据库事务ACID/隔离级别
参考博客 1. 事务的定义 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一组SQL语句或整个程序 ...
随机推荐
- jasperreports+IReport 5.56,集成到Spring MVC4.0案例
首先,先说一下需求,项目需要打印一些报表,也没多想,直接就在jsp页面设置了样式,前台直接调用window.print()写了打印功能,但是例会的时候,领导提出需要一些比较麻烦的打印,自己写肯定费时间 ...
- oracle存储过程调试报错 ORA-0131 Insufficient privileges 处理
必须使用oracle用户登录oracle@sqlplus system/system123 as sysdba 以SYS用户登录数据库,执行赋权操作: grant DEBUG CONNECT SES ...
- 【Linux】comm指令
语法 comm [-123][--help][--version][第1个文件][第2个文件] 参数 -1 不显示只在第1个文件里出现过的列 -2 不显示只在第2个文件里出现过的列 -3 不显示只在第 ...
- npm install 插件 --save与 --save -dev的区别
npm i 插件 ,会把插件安装到node_modules目录中,不会修改package.json, npm i 插件 --save ,项目发布上线之后还会依赖用到的插件,没有这些插件,项目不能 ...
- mysql数据库 事务和索引
1.MySQL数据库特性: 原子性(atomidity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一 ...
- django_视图层_编写url
URL的配置 django中,url也称urlconf,默认的django项目设定两个url地址,分别是admin站点管理和首页地址.from diango.urls import path,incl ...
- 一个mysqldump的报错
1.MySQL版本 5.7.14-log 2.问题分析 mysqldump -uxxx -pxxx db_nale 一般来讲上述命令主要是用于MySQL的逻辑备份,用来备份某个数据的全部表,但是我在执 ...
- MATLAB EMD 初始
帮小伙伴研究这个 随便写写 安装参考https://blog.csdn.net/qrlhl/article/details/52213135 函数学习: disp函数 : 1.disp函数:显示文本 ...
- python excle写数据
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/4/24 10:30 # @File : Excle写.py # @Softw ...
- SpringCloud基于消息总线的配置中心
@https://www.cnblogs.com/ityouknow/p/6931958.html Spring Cloud Bus Spring cloud bus通过轻量消息代理连接各个分布的节点 ...