【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】,然后找出一个可读的数据

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL事务隔离级别包括:未提交(READ UNCOMMITTED)、提交(READ COMMITTED)、可重复(REPEATABLE READ)和串行化(SERIALIZABLE)。MySQL实现事务隔离级别的主要手段是使用MVCC(多版本并发控制)技术,具体来说就是利用时间戳或版本号来追踪数据的变化,从而实现各个事务之间的隔离。 ### 回答2: 数据库事务隔离级别主要包括未提交、提交、可重复和串行化四种级别。 1. 未提交(Read Uncommitted):事务可以取其他事务未提交的数据,可能导致脏(Dirty Read)问题。 2. 提交(Read Committed):事务只能取其他事务已提交的数据,避免了脏问题,但可能出现不可重复(Non-repeatable Read)问题。 3. 可重复(Repeatable Read):事务在整个过程中能够多次取到相同的数据快照,避免了脏和不可重复问题。 4. 串行化(Serializable):事务执行时对数据加锁,保证了数据的完全隔离,但可能导致并发能下降。 MySQL事务隔离级别通过锁机制来实现。为了实现不同的隔离级别,MySQL使用了多版本并发控制(MVCC)机制。MVCC根据事务开始时间来判断可见,每个事务启动时会分配一个唯一的事务ID,用来标识该事务,数据库会把此时版本号小于或等于该事务ID的数据行视为可见。 对于不同的隔离级别,MySQL采取了以下策略: - 未提交:对被修改的数据行不加任何锁,事务启动后可以取到其他未提交的事务的数据。 - 提交:对于操作,采用共享锁(Shared Lock),即只允许取其他已提交事务的数据,不允许取未提交的事务数据。 - 可重复:在事务期间,对于操作,采用快照(Snapshot Read),即事务开始时数据的一个快照事务到的数据保持一致。 - 串行化:对于和写操作,采用行级排他锁(Row-Level Exclusive Lock),即对取和修改的数据行都加锁,保证写的完全隔离。 总结来说,MySQL事务隔离级别是通过锁机制和MVCC机制来实现的,通过对数据行的锁定和版本控制,保证了不同事务隔离级别下数据的可见和一致。 ### 回答3: 事务隔离级别是指数据库系统对并发操作的处理方式以及保证事务之间的隔离程度。常见的事务隔离级别有未提交(Read Uncommitted)、已提交(Read Committed)、可重复(Repeatable Read)和串行化(Serializable)。 MySQL事务隔离级别通过锁定机制来实现。具体来说,Mysql使用两种主要的锁定方式:共享锁(Shared Locks)和排他锁(Exclusive Locks)。 对于未提交级别,Mysql不使用任何锁定机制,允许事务取未提交的数据。这种隔离级别的能较高,但会导致脏(Dirty Reads)的问题。 对于已提交级别,Mysql使用共享锁定。即一个事务取数据时,该数据会被加上共享锁,直到该事务提交后才会释放锁。这种隔离级别可以避免脏的问题。 对于可重复级别,Mysql使用共享锁和排他锁。一个事务取数据时,会加上共享锁。如果在该事务还未提交之前,其他事务想要修改该数据,则会被阻塞。这种隔离级别可以避免脏和不可重复(Non-repeatable Reads)的问题。 对于串行化级别,Mysql使用排他锁。即一个事务取数据时,会加上排他锁,其他事务无法同时取或修改该数据。这种隔离级别可以避免脏、不可重复和幻(Phantom Reads)的问题。 总之,Mysql事务隔离级别是通过锁定机制来实现的,不同的隔离级别会使用不同的锁定方式来保证事务之间的隔离和数据的一致

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值