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当前读和快照读相关推荐

  1. MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁

    文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开lock和latch ...

  2. 【MySql:当前读与快照读】

    当前读与快照读 MVCC (Multi-Version Concurrency Control) (基于锁的并发控制,Lock-Based Concurrency Control).MVCC最大的好处 ...

  3. 【MySQL】当前读、快照读、MVCC

    [MySQL]当前读.快照读.MVCC 当前读: select...lock in share mode (共享读锁) select...for update update , delete , in ...

  4. mysql 快照 理解_MySQL - 当前读和快照读

    当前读和快照读 InnoDB 给每一个事务生成一个唯一事务 ID 的方法称为生成快照,因此这种场景称为快照读. 但是对于更新数据不能使用快照读,因为更新数据时如果使用快照读会可能会覆盖其他事务的更改. ...

  5. MySQL学习(1)-当前读和快照读

    前言 在MySQL中读取数据有两种方式,一种是当前读,另一种是快照读,理解这两种读取数据的方式有助理解更多MySQL相关锁的知识. 当前读 当前读,顾名思义就是读取当前最新的数据,并且对读取的数据加锁 ...

  6. 锁模块之当前读和快照读

    锁模块之当前读和快照读 InnoDB可重复读隔离级别下是如何避免幻读的. 这里我们分为表象和内在 表象:快照读(非阻塞读)--伪MVCC (前提是在RR级别下) 内在:next-key 锁(行锁+ga ...

  7. 数据库-当前读与快照读

    当前读:insert update delete for update 快照读:不加锁的非阻塞读,select.目的是为了提高并发性能 在RC隔离级别下,当前读与快照读结果是一样的. 在RR隔离级别下 ...

  8. mysql 一致性读_mysql/mariadb知识点总结(27):一致性读,快照读

    在本博客中,"mysql"是一个系列文章,这些文章主要对mysql/mariadb的常用知识点进行了总结,每一篇博客总结的知识点有所不同,具体内容可参考mysql文章列表. mys ...

  9. mysql当前读与快照读

    快照读 读取的是记录数据的可见版本(可能是过期的数据),不用加锁 实验测试快照读(select时为快照读) 由此也可以看出只要事务A还未提交,那么select出来的数据都是read view版本链中的 ...

  10. MySQL数据库锁模块中的当前读和快照读

    文章目录 当前读 快照读 当前读 select - lock in share mode,select - for update update,delete,insert 即当前读是加了锁的增删改查操 ...

最新文章

  1. java 多路分发_java实现多路分发
  2. python 合并重叠数据
  3. c语言if不能判断u8变量值,C语言变量名命规则.doc
  4. IT人应当知道的10个行业小内幕
  5. Unity3D-C#脚本介绍
  6. 04-----赋值运算符
  7. mininet编程实现交换机规则的插入、删除与修改。_Mysql闲聊之从Redo、Undo日志到MVCC实现原理
  8. 【国产化电脑】如何有效避免违规外联
  9. 一步步的Abaqus2021版本安装教程+汉化操作
  10. 华为HCNA之配置OSPF认证实验
  11. flash用FlashPlayer将一个swf打包成exe
  12. Unity给小鳄鱼洗澡2D流体水实现
  13. The database returned no natively generated identity value
  14. 台式计算机显示不了无线网络,台式电脑无线网卡不显示wifi,电脑怎样连接wifi
  15. Cython使用及pycharm
  16. C语言快速互转HEX(16进制)和原始字符串/数组
  17. CAR-T细胞治疗最新进展(2021年12月)
  18. C/C++ 下标运算符subscript、后缀表达式、正负下标
  19. 一.wireshark界面学习
  20. 网站被流量攻击怎么处理

热门文章

  1. 虚拟机2003服务器配置教程,虚拟机安装win2003及Ip配置.doc
  2. 2021“西湖论剑“网络安全大赛Writeup
  3. 校园网连不上,火绒检测dns错误但修复不了,360直接搞定,nice!
  4. Elite教程系列(一):快速上手
  5. amap高德地图应用(el-amap-marker坐标点;el-amap-info-window信息窗体;el-amap-polyline折线、折线颜色,宽度、实虚线等)
  6. java 读取xls、xlsx文件
  7. PMI是什么参数在LTE中??和RI,CQI怎么作用的??
  8. Zynq7跑peta linux,ZYNQ跑系统 系列(二) petalinux方式移植linux petalinux-config遇到问题...
  9. python构造方法的方法名_构造方法是类的一个特殊方法,Python中它的名称为()。
  10. JAVA实现排列组合