MySQL当前读和快照读
1.当前读和快照读
当前读:读取的是记录的最新版本,并且读取之后还要保证其他并发事务不能修改当前记录,对读取的记录加锁
当前读:select…lock in share mode,select…for update
当前读:update,delete,insert快照读:可能读取的并不是当前记录的最新版本,可能是之前的历史版本
快照读:不加锁的非阻塞读,select
不加锁的条件是在当前事务隔离级别是非serializable前提下才成立,在SE下面,由于是串行读,所以此时的快照读也退化成当前读,即select…lock in share mode模式;
之所以出现快照读,是基于提高并发性能的考虑;
快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免的加锁操作,因此开销更低
2.RC和RR级别下的当前读和快照读
- 在RC隔离级别下:
当前读和快照读读取的结果是一样的 - 在RR隔离级别下:
快照读有可能读到数据的历史版本
也有可能读到数据的当前版本
创建快照的时机决定了读取数据的版本
快照读 ==> 另外一个线程修改 ==>当前读 ==> 快照读(最后这次快照读,读取的是历史版本)
另外一个线程修改 ==> 当前读 ==> 快照读(最后这次快照读,读取的是当前版本)
3.RC和RR级别下的InnoDB的快照读(即非阻塞读)是如何实现的
数据行里的隐式字段DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID
DB_TRX_ID:最后一次修改改行记录的事务的ID
DB_ROLL_PTR: 回滚指针,即写入回滚端undo日志记录,如果该行记录被更新,则undo log records包含重建该行记录被更新之前状态所包含的信息
DB_ROW_ID:行ID,用来生成默认聚簇索引undo 日志
当我们对行记录做了变更操作时,就会存undo记录
undo记录中存储的是老版数据,当一个旧的事物需要读取数据时,为了能读取到老版本的数据,需要顺着undo链,找到满足其可见性的记录
undo log主要分为两种insert undo log和update undo log
—insert undo log 事务对新纪录insert产生的undo log,只在事务回滚时需要,并且在事务提交后就可以立即丢弃
—update undo log 事务对记录进行delete或者update时,产生的undo log,不仅在事务回滚时需要,快照读也需要,所以不能随便删除,只有当数据库所使用的快照中不涉及该记录,对应的回滚日志才会被perge线程删除
read view
做可见性判断
记录当前处于活动状态的所有事务ID,RR级别下,第一次快照读时创建,RC级别下,每次快照读均会创建新的
遵循一个可见性算法:主要是将要修改的DB_TRX_ID取出来,与系统其他活跃事务ID做对比,如果大于或者等于这些ID的话,就通过DB_ROLL_PTR指针去取出undo log从上层往下层的DB_TRX_ID,直到小于这些活跃事务ID为止,这样就保证了我们获取的事务版本是当前可见的最稳定的版本
MySQL当前读和快照读相关推荐
- MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁
文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开lock和latch ...
- 【MySql:当前读与快照读】
当前读与快照读 MVCC (Multi-Version Concurrency Control) (基于锁的并发控制,Lock-Based Concurrency Control).MVCC最大的好处 ...
- 【MySQL】当前读、快照读、MVCC
[MySQL]当前读.快照读.MVCC 当前读: select...lock in share mode (共享读锁) select...for update update , delete , in ...
- mysql 快照 理解_MySQL - 当前读和快照读
当前读和快照读 InnoDB 给每一个事务生成一个唯一事务 ID 的方法称为生成快照,因此这种场景称为快照读. 但是对于更新数据不能使用快照读,因为更新数据时如果使用快照读会可能会覆盖其他事务的更改. ...
- MySQL学习(1)-当前读和快照读
前言 在MySQL中读取数据有两种方式,一种是当前读,另一种是快照读,理解这两种读取数据的方式有助理解更多MySQL相关锁的知识. 当前读 当前读,顾名思义就是读取当前最新的数据,并且对读取的数据加锁 ...
- 锁模块之当前读和快照读
锁模块之当前读和快照读 InnoDB可重复读隔离级别下是如何避免幻读的. 这里我们分为表象和内在 表象:快照读(非阻塞读)--伪MVCC (前提是在RR级别下) 内在:next-key 锁(行锁+ga ...
- 数据库-当前读与快照读
当前读:insert update delete for update 快照读:不加锁的非阻塞读,select.目的是为了提高并发性能 在RC隔离级别下,当前读与快照读结果是一样的. 在RR隔离级别下 ...
- mysql 一致性读_mysql/mariadb知识点总结(27):一致性读,快照读
在本博客中,"mysql"是一个系列文章,这些文章主要对mysql/mariadb的常用知识点进行了总结,每一篇博客总结的知识点有所不同,具体内容可参考mysql文章列表. mys ...
- mysql当前读与快照读
快照读 读取的是记录数据的可见版本(可能是过期的数据),不用加锁 实验测试快照读(select时为快照读) 由此也可以看出只要事务A还未提交,那么select出来的数据都是read view版本链中的 ...
- MySQL数据库锁模块中的当前读和快照读
文章目录 当前读 快照读 当前读 select - lock in share mode,select - for update update,delete,insert 即当前读是加了锁的增删改查操 ...
最新文章
- java 多路分发_java实现多路分发
- python 合并重叠数据
- c语言if不能判断u8变量值,C语言变量名命规则.doc
- IT人应当知道的10个行业小内幕
- Unity3D-C#脚本介绍
- 04-----赋值运算符
- mininet编程实现交换机规则的插入、删除与修改。_Mysql闲聊之从Redo、Undo日志到MVCC实现原理
- 【国产化电脑】如何有效避免违规外联
- 一步步的Abaqus2021版本安装教程+汉化操作
- 华为HCNA之配置OSPF认证实验
- flash用FlashPlayer将一个swf打包成exe
- Unity给小鳄鱼洗澡2D流体水实现
- The database returned no natively generated identity value
- 台式计算机显示不了无线网络,台式电脑无线网卡不显示wifi,电脑怎样连接wifi
- Cython使用及pycharm
- C语言快速互转HEX(16进制)和原始字符串/数组
- CAR-T细胞治疗最新进展(2021年12月)
- C/C++ 下标运算符subscript、后缀表达式、正负下标
- 一.wireshark界面学习
- 网站被流量攻击怎么处理
热门文章
- 虚拟机2003服务器配置教程,虚拟机安装win2003及Ip配置.doc
- 2021“西湖论剑“网络安全大赛Writeup
- 校园网连不上,火绒检测dns错误但修复不了,360直接搞定,nice!
- Elite教程系列(一):快速上手
- amap高德地图应用(el-amap-marker坐标点;el-amap-info-window信息窗体;el-amap-polyline折线、折线颜色,宽度、实虚线等)
- java 读取xls、xlsx文件
- PMI是什么参数在LTE中??和RI,CQI怎么作用的??
- Zynq7跑peta linux,ZYNQ跑系统 系列(二) petalinux方式移植linux petalinux-config遇到问题...
- python构造方法的方法名_构造方法是类的一个特殊方法,Python中它的名称为()。
- JAVA实现排列组合