首页 > 数据库 >MySQL之MVCC总结理解

MySQL之MVCC总结理解

时间:2023-01-31 21:46:36浏览次数:42  
标签:总结 事务 快照 读取 read MVCC 回滚 MySQL view

前置知识

涉及到的几个概念:隐藏字段,undo log,readview

  1. (每个表中的)隐藏字段:最后修改记录的事务id,回滚指针
  2. undo log :在插入/更新数据的时候记录回滚日志
  3. 当前读:读取的是记录的最新版本,在执行的时候会加锁,防止其他并发事务修改该记录
    select ... for update、update、insert、delete(排他锁)都是一种当前读
  4. 快照读:读取的可能是记录的可见版本,可能是历史记录

对MVCC理解:

实现了事务隔离
每次开启事务都会创建一个 read view ,以及回滚日志 undo log,从而会形成一条回滚链
关闭事务那么 read view 也会被关闭
image

回滚日志何时被清除?

如果 read-view A 被关闭了,且 '将2改成1' 这个回滚日志之前没有 read-view 了,那么此回滚日志就可以被删除

分析利用MVCC特性读取同一个记录的不同版本

image

对于同一个记录,如果对它开启了多次事务,就会产生如图中的多个快照读 A,B,C。
假设事务A,B,C分别对应于上述快照读。由图可知当前值为4,如果事务 A 需要读取该记录值,那么需要由当前值 依次回滚 从而得到 1 这个值。

分析事务是否是隔离的

事务的隔离,指的就是多个事务的执行不会互相影响。具体点说,在 RR 隔离级别下,事务 A 在开启后,多次读取同一个记录,读取到的值始终是一致的。

从这个引出了一致性读 (read-view) 这个概念。能够保证事务 A 上述运行效果,依靠的是 MVCC (多版本并发控制) 这个概念。MVCC 通过 read-view,row_trx_id,回滚日志,回滚链等保证了前后读取的一致性,这是对于一个事务中只有查询操作而言的。

在事务 A 开启后,其实对整个库进行了一次快照,但是这个快照并不是真正的整个数据库数据,这太庞大了。而是由 活跃事务数组 来保证对全库的快照。
image

活跃事务是指当前未提交的所有事务,通过这么一个活跃数组,就达到了开启事务后对全库数据进行快照的效果。
从这个角度来看,事务是隔离的。因为这是站在只有查询语句的视角。

而从下面这个视角来看,事务是不隔离的。因为有当前读这个概念。
image

有上述两个事务,初始数据 (id,k):(1,1),开启事务 B
事务 C 更新后变成(1,2)
此时事务 B 才执行更新,而更新操作需要读取此记录的 当前值,也就是事务 B 读取到了 (1,2),然后做更新;而后再次查询,会发现(1,3)这种情况。
这样看事务好像是非隔离的,因为事务 B 是先于事务 C 开启的,它理应读到 (1,1) 这样的数据然后去做修改。
但是 MySQL 要保证不能丢失事务 C 的修改,且它已经提交了。所以可以得知:对于更新操作,是先后写的,而且这个读是当前读(即该记录的最新版本值),并且要获取行写锁 ( X )。

标签:总结,事务,快照,读取,read,MVCC,回滚,MySQL,view
From: https://www.cnblogs.com/pzistart/p/17080863.html

相关文章

  • 2023第一个月总结
    对现有工作的不满意,发现身边人逐渐被生活改变,成为生活的累赘。工作的螺丝钉,机械且重复的活着,毫无新意。那我呢?对较好收入的屈服?不,我不想被生活摒弃,成为一颗螺丝钉。但我......
  • MySQL执行计划
    一、什么是MySQL执行计划在平时的开发工作中,少不了数据库的使用,那么就会涉及到sql语句,如何知道sql语句执行的过程,以及sql语句执行的性能,通过执行计划模拟优化器执行sql进......
  • mysql学习问题记录
    Q:MySQL在创建外键索引时,使用工具会出现创建完成但是闪一下就没了使用CONSTRAINT'外键索引名'FOREIGNKEY('xx')REFERENCES数据库名(xx)创建时,只会出现索引信......
  • 工作总结及思考
    今天是2023年1月31日,兔年的第一天。一、工作内容:1.开发技术政策方面:针对主任对开发技术政策提出的内容进行了修改,发现自己没有剩余油挖潜的能力,无法有理有据地对剩余油及......
  • MySQL------8.0新特性:公用表表达式
    公用表表达式(或通用表表达式)简称为CTE(CommonTableExpressions)。CTE是一个命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点......
  • MySQL查询不区分大小写的问题总结
    MySQL查询不区分大小写问题1.问题描述最近,笔者在开发FleaAuth模块的过程中,准备验证以注册的账号huazie进行登录的场景,结果以HUAZIE成功登录,而数据库中存储的账号是hua......
  • tk4 安装mysql8
    sudoyuminstallmysql-serverservicemysqldrestartgrep"temporarypassword"/var/log/mysqld.log  --查看临时密码mysql-uroot-pupdateusersetauthent......
  • mydumper学习总结
    0简介mydumper是一款社区开源的逻辑备份工具。该工具主要由C语言编写,目前由MySQL、Facebook等公司人员开发维护。mydumper  负责导出MySQL数据库的一致备份m......
  • MySQL------数据类型重点关注
    整数类型整数类型字节有符号数取值范围无符号数取值范围TINYINT1-128~1270~255SMALLINT2-32768~327670~65535MEDIUMINT3-8388608~......
  • 有关类型判断的总结
    1.判断是否为(String)类型isString=o=>Object.prototype.toString.call(o)==='[objectString]'2.判断是否为(Number)类型isNumber=o=>Object.prototype.toString.cal......