【Mysql篇】什么是MVCC?什么是快照读?版本链?什么是readView?MVCC如何实现事务的隔离性?

什么是MVCC(多版本并发控制)

关键字:快照读、事务的隔离性(ACID)、trx_id、roll_pointer、undolog、版本链、readView、判断逻辑、判断顺序

题外话:当前读和快照读

1. 当前读(行锁 + 间隙锁)

就是读取当前数据的最新记录,会加锁,为了保证其他事务不能修改记录(如select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁))

当前读由行锁+间隙锁实现

2. 快照读(mvcc + undolog)

不加锁的select操作就是快照读(隔离级别不能是串行化,如果是串行化快照读就变成了当前读)

快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

在这里插入图片描述
图片链接:https://www.bilibili.com/video/BV1t5411u7Fg?spm_id_from=333.337.search-card.all.click

1. 定义(Mutli Version Concurreny Control)

参考链接:mysql MVCC+间隙锁解决幻读理解

MVCC其实就是一个多版本并发控制,即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据,在读数据时选择不同版本的数据即可以实现对事务结果的完整性读取。

2. MVCC的组成要素

1. 每条记录有三个隐藏列

1. 事务ID(trx_id)

记录创建这条记录/最后一次修改该记录的事务ID

2. 回滚指针(roll_pointer)

指向undolog日志的上一个版本

3. 隐藏主键(row_id)

隐含的自增ID。现在不知道干嘛用的

2. undolog日志

每次update操作都会生成一条undo_log日志,分为insert undo logupdate undo log

1. 分类
1. insert undo_log(insert操作,给自己事务看的)

如insert操作,只针对当前事务,在insert操作后产生undo_log记录,在事务提交后删除undo_log记录,说白了就是给当前事务自己看的.

2. update undo_log(update、delete操作)

update 和 delete操作,会根据隔离级别不同事务版本的数据可见性不同

注意:update操作生成undolog日志,select操作生成readView读视图对象!两个生成时机要区分开

3. 版本链

通过回滚指针undolog日志连接起来,形成的就叫做版本链

3. readView(读视图)

1. 组成
1. m_ids(存活的事务id列表)

表示生成readView时,当前系统中活跃的读写事务的事务id列表

白话文:存活、活跃,指的就是未commit

2. min_trx_id(m_ids中的最小事务id)

表示生成readView时,当前系统中活跃的读写事务中最小的事务id

3. max_trx_id(新的事务id值)

表示生readView时,系统中应该分配给下一个事务的id值

4. creator_trx_id(生成这个readView的事务id)

表示生成这个readView的事务id

2. 有什么作用

让我知道 我在这个版本链中选择哪一条undolog记录

3. readView是如何判断版本链中的那个版本可用的

每一个undolog有自己的事务id,叫做trx_id

在这里插入图片描述
图片链接:https://www.bilibili.com/video/BV1t5411u7Fg?spm_id_from=333.337.search-card.all.click
在这里插入图片描述

1.什么时候生成Read-View?

要看数据库的隔离级别:

  • 可重复读:返回的是第一次查询生成的【read-view】
  • 读已提交每次select时都会重新生成一个新的【read-view】

3. MVCC实现原理

查询的时候会读取出【read-view】,并根据read-view从undo_log日志中最新的记录依次往下找

有点晦涩难懂:具体的操作看这篇文章,写的非常棒!
https://www.cnblogs.com/boluopabo/p/13111961.html

5. MVCC主要有什么作用

1. 非阻塞的并发读写

提高并发读写性能,操作时会生成事务id,能够更好地解决读-写冲突,不加锁、非阻塞的并发读

2. 实现读已提交和可重复读

MVCC只能实现读已提交可重复读;如果是读未提交,那么每次查询都能获取最新的修改值。

1. 问:MVCC如何实现RC(以select为单位的)

读已提交生成readView是以select为单位的,每次select时都会重新生成一个新的【read-view】,然后去【undo】日志中寻找符合结果的一条数据,

2. 问:MVCC如何实现RR(以事务为单位的)

可重复读生成readView是以事务为单位的,第一次查询的时候生成一个新的【read-view】,后面的查询会继续沿用第一次的【read-view】,然后找出一个可读的数据

参考资源接:[深入理解MySQL事务MVCC原理](https://wenku.csdn.net/doc/pz79txp48b?utm_source=wenku_answer2doc_content) 在MySQL实现事务的ACID特需要依赖存储引擎,特别是InnoDB存储引擎,它支持事务并且符合ACID原则。原子是通过事务日志实现的,它可以保证事务的每个操作要么全部完成,要么全部不执行;一致确保了数据库的状态在事务前后都保持有效;隔离通过锁机制和MVCC实现,而持久则是利用了MySQL的redo log来确保数据的持久化。 MVCC(多版本并发控制)是InnoDB实现事务隔离级别的重要机制,它通过为每个事务生成数据快照实现非锁定读取。每个事务只能看到自己开始时刻的数据版本,这在可重复(REPEATABLE READ)隔离级别下尤其重要,它保证了事务中的读取不会受到其他并发事务写操作的影响。 在实现上,MVCC依赖于undo log和读取视图。undo log存储了数据的历史版本,而读取视图则决定了事务能看到哪些版本的数据。通过这种方式,MySQL能够在不锁定数据的情况下提供高度的一致隔离,从而提高了数据库操作的并发能。对于想要深入了解MySQL事务MVCC原理的者,《深入理解MySQL事务MVCC原理》是一本非常有价值的资料。它不仅包含了理论知识,还包含了大量的实战案例和深入的内部原理分析,有助于者在实际工作中更好地运用这些知识,确保数据库操作的安全和效率。 参考资源接:[深入理解MySQL事务MVCC原理](https://wenku.csdn.net/doc/pz79txp48b?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值