MVCC——一个我特别不想聊的技术


前言

提示:此处涉及到的点比较多,若是有什么疑问点欢迎下方交流
我最开始仅仅是在spring层面进行使用Mysql的事务,但是后来不知道什么时候忽然被面试官问到这个问题了,没办法问到了就整理一下吧。
整理了三天,总算是出来了,但是还没有到自己想要的那么精简
so,有好的意见记得找我哦


一、MVCC?官方一些解释

MVCC全称为Multi-Version Concurrency Control即多版本并发控制。
它是一种用于数据库管理系统中的并发控制的技术,
在许多数据库系统(如MySQL的InnoDB存储引擎、PostgreSQL等)中得到使用。

MVCC通过为数据库对象(如行记录)提供多个版本来实现在没有锁定资源的情况下进行并发访问,增强了读写(这两个是一个整体)操作的并发性能。

但是在我看来就是一个思想,我们实际上用到的就是一个读数据的级别(当前读还是快照读)和同时操作多张表的原子性要么都操作成功,要么都操作失败

二、介绍MVCC

1.并发控制的必要性

1、并发控制是数据库管理系统同步多个事务的行为
2、避免由于事务之间的相互影响引起的一系列问题。
如果不妥善处理,并发操作可能会导致数据不一致,
例如脏读(读取未提交的数据)。
不可重复读(一个事务内两次及以上读取不一致)。
幻读(同一个事务两次及以上读取时出现新的行)。
补充:其实我也搞不懂为什么要查询两次或者多次在一个事务中?
但是:MVCC主要是解决读-写和写-读场景下的并发问题,而不是写-写场景,写-写通常还需要依赖锁机制。

2. MVCC的定义及目的

MVCC是一种用来控制数据库并发访问的技术,允许不同的事务看到某个时间点的数据快照。MVCC的主要优势是它可以在不加锁的情况下使读取操作并行进行,从而大大提高了事务的处理速度,同时维护了数据的一致性。
这里的一致是在某些场景下(如RR)的同一个事务内的一致。

MVCC的优势在于:

  1. 减少了锁的需求:读取操作通常不需要锁定资源,这样减少了锁竞争,提高了并发度。
  2. 读写分离:读写操作能够相互独立进行,因此在很多情况下,对数据的写入(更新、删除)不影响到数据的读取。
  3. 避免了读写冲突:读者不会阻塞写者,写者也不会阻塞读者。(因为读取的就不是一个地方)

补充:在MySQL的InnoDB存储引擎中每行记录都有隐藏的系统列如下:
DB_TRX_ID(最近修改事务的ID)
DB_ROLL_PTR(撤回指针,指向undo log的记录)
DB_ROW_ID(当未定义聚集索引时的隐藏的行ID)
以支持MVCC的实现。当你在执行SELECT、UPDATE、DELETE等操作时,InnoDB会通过MVCC机制确保每个事务都能正确地看到它应该看到的数据版本。

3、MVCC的核心机制和组件

Undo Log版本链:

当数据被修改时,其原版本并不会立即被覆盖,而是被记录在Undo Log中并生成版本链(类似于双向裂变)。如果需要,可以通过Undo Log找回之前的数据版本。这个机制使得数据库能够支持事务的回滚以及提供旧数据版本给不同的事务访问。

ReadView:

在事务开始时,系统会生成一个ReadView,其中记录了活跃的事务及其ID。ReadView确保了在事务执行期间,即使外部数据发生变化,事务也能继续看到一致的数据视图。还有最新的事务id以及最小事务id

4. 隔离级别与MVCC

<think> 嗯,用户这次明确提出了一个定义性问题:"我想了解MVCC的定义"。这需要我提供一个简洁却完整的标准化定义,同时结合数据库领域的专业共识。 从提供的引用材料来看,多个引用都从不同角度描述了MVCC的本质:[^1]强调它是并发控制机制,[^2][^4]提到它通过多版本解决读写冲突,[^3][^5]则详细明了时间戳和版本选择机制。这些正好构成定义的核心要素。 用户可能是数据库初学者,所以定义需要避免过于技术化。不过也得警惕过度简化——比如不能只"多版本控制",必须点明"并发控制"这个根本属性。考虑到用户参考了隔离级别相关内容(引用[^5]提到幻读),可以隐含MVCC与事务隔离的关系,但定义本身不宜展开。 需要特别注意格式规范:定义中的关键术语如"多版本并发控制"要加粗,英文全称首次出现需标注缩写。引用材料中[^4]的表述最接近标准定义,但需要整合其他引用补充"读写操作处理方式"这一要点。 最后考虑延伸价值:用户要求"定义"但后续可能关注原理,相关问题可以自然引导到MVCC实现机制(如版本链)和隔离级别应用。第三个问题故意设计成对比题型,因为引用[^2]提到"降低死锁概率",这能帮助用户建立差异化认知。 </think> 基于引用内容,MVCC 的完整定义如下: **MVCC(Multi-Version Concurrency Control,多版本并发控制)** 是一种数据库管理系统中的并发控制方法,其核心机制是通过维护数据的多个历史版本,实现高效的读写并发操作。具体定义为: 1. **基本目标** 在确保事务隔离性和数据一致性的前提下,让读写操作互不阻塞(读不阻塞写,写不阻塞读),降低死锁概率,提升高并发场景下的数据库性能[^2][^4]。 2. **核心原理** - **数据多版本**:每条数据存在多个版本,每个版本关联两个关键标识: - 创建该版本的事务时间戳(或事务ID) - 删除该版本的事务时间戳(或事务ID)[^3][^4][^5]。 - **事务时间戳**:每个事务启动时获得唯一递增的时间戳,用于确定数据可见性[^3][^4]。 - **读操作**:事务仅读取在其时间戳之前已提交的最新数据版本,实现一致性快照读[^3][^4][^5]。 - **写操作**:修改数据时创建新版本(非覆盖旧版本),并标记新版本的时间戳为当前事务ID[^3][^4]。 3. **关键优势** - 读写操作无需加锁,避免阻塞 - 通过版本快照解决幻读问题(RR隔离级别下)[^5] - 减少死锁发生概率[^2][^4]。 > 示例:事务A(时间戳=100)启动后,即使事务B(时间戳=101)修改了某数据并提交,事务A仍只能读取时间戳≤100的数据版本,确保读一致性[^3][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值