数据库并发多版本控制mvcc

本文深入探讨了数据库并发多版本控制(MVCC)的工作原理,包括其如何在保证数据一致性的同时提升读性能,以及在不同事务级别下的适用性和限制。通过分析MVCC的查询规则和数据细节,揭示了其在高并发场景下的优势与挑战。


如果严格采用数据库三级封锁协议,采用第二第三级封锁协议时,读写数据加锁,数据库的读操作会被阻塞,在读写并发访问量高的场景下读操作性能会急剧下降,为提高高并发场景下数据库的读性能,数据库一般采用并发多版本控制(mvcc)来实现。
mvcc是一种不利用锁机制实现的隔离,主要实现了在保证数据一致性的前提下实现数据的续写并行
数据库会为每条记录增加三个字断,创建时间戳(事务号),删除时间戳,回滚日志地址,数据的创建会把当前事务号写入插入时间戳,每条数据的更新会以标记删除,在删除时间戳写上当前事务号,新插入一条数据,插入时间戳写上当前事务号,每条数据存在多个版本。

mvcc查询需要遵循以的规则

1.只查 创建时间比当前时间小,删除时间比当前时间大的数据,插入时间比当前时间大或删除时间比当前时间小的数据对当前事务不可见。确保只查数据库已提交事务数据。
2.更新只更新最新的版本数据
3.更新数据时加锁。插入一条创建时间为当前事务时间标记的记录,在原数据删除事务时间打上当前事务时间标识。

mvcc适用场景

可重复读事务级别,mvcc完全符合,读可提交事务级别,mvcc部分符合,脏读与序列化度与mvcc完全不符。

在理想的mvcc是很难实现的,多个版本书库同时存在容易相互覆盖,导致事务型数据库不满足aicd事务特性,因此数据库在做更新操作时会上锁。保证两个写事务之间互斥,不会相互覆盖。在mvcc中加锁与mvcc定义不是很相符,只能说目前数据库实现的,mvcc都存在局限性,真正的mvcc是一种理想状态。

mvcc查询数据细节

如果查询只遵循查找创建时间比当前事务小,删除时间比当前事务时间大的数据,还存在以下问题,
1.如何保证查询的数据已提交,查询到脏数据是不可以的
2.如何保证可重复读。

针对第一个问题数据库会有一张活跃事务表,每次创建新事务时拷贝一份当前活跃事务副本,记最小事务为Tmin,最大事务为Tmax,当前数据行事务为T.执行查询时遍历结果集,
1.如果当前行事务T<Tmin,说明说明T事务前面的事务都已经提交,返回当前行数据。
2.如果当前行事务T>Tmax,说明当前数据行是在当前事务创建后生成的,数据不可见,根据回滚指针字段找到上一版本数据,从新比较事务时间大小。
3.如果当前行事务 Tmin<T<Tmax. 遍历当前活跃事务副本,如果T为活跃事务列表中的某值,说明该数据行未提交数据,根据数据回滚指针找到上一版本数据,从新比较数据,反之则说明该数据为当前事务修改,对当前事务可见,返回数据行。

事务级别为读已提交时每次查询都拷贝一份当前活跃事务副本即可。

多版本并发控制MVCC)是一种数据库并发控制机制,其核心目标是提升数据库在高并发环境下的性能,同时避免传统锁机制带来的资源竞争和阻塞问题。MVCC 通过为每个事务提供数据的一致性视图,允许读写操作并行执行而不互相阻塞,从而提高系统的吞吐量和响应速度 [^1]。 ### MVCC 的工作原理 MVCC 的核心思想是通过维护数据的多个版本来实现并发控制。每当事务对数据进行修改时,系统不会直接覆盖原有数据,而是生成一个新的数据版本,并通过某种方式标识该版本的可见性。这样,不同的事务可以基于自身的执行时间点访问到合适的数据版本,从而避免了读写操作之间的冲突 [^1]。 在 MVCC 机制中,数据行通常包含额外的元信息,例如事务 ID(表示该行的创建或最后一次修改的事务)和可能的删除标记(用于标识该行是否已被删除)。这些信息用于确定事务在读取数据时是否可见 [^2]。 ### 关键组成部分 MVCC 的实现依赖于几个关键概念和组件,包括: - **ReadView**:ReadView 是 MVCC 中用于判断某个事务是否能看到其他事务修改的关键结构。它记录了当前活跃事务的列表以及事务的起始和结束时间点,通过比较事务 ID 来确定数据版本的可见性 [^4]。 - **Undo Log**:Undo Log 是用于存储数据旧版本的日志结构。当事务对数据进行修改时,旧版本的数据会被记录到 Undo Log 中,以便其他事务在需要时能够读取到一致性视图 [^4]。 - **Purge**:Purge 是 MVCC 中的一个后台进程,负责清理不再需要的旧数据版本。随着事务的提交或回滚,某些数据版本可能变得不可见,因此可以安全地被删除以释放存储空间 [^4]。 ### 数据库应用 MVCC 在现代数据库系统中得到了广泛应用,尤其是在支持高并发数据库如 PostgreSQL 和 MySQL 的 InnoDB 存储引擎中。PostgreSQL 的 MVCC 实现通过保持多个数据版本,允许读写操作并行进行,有效提高了数据库的性能和响应速度。通过避免锁竞争、提供一致性视图以及支持长时间运行的事务,MVCC 使得 PostgreSQL 能够在复杂的应用场景中表现优异 [^3]。 在事务隔离级别的实现中,MVCC 也扮演着重要角色。不同的事务隔离级别(如读已提交、可重复读)通过控制 ReadView 的生成和更新方式来实现不同级别的数据一致性 [^5]。 以下是一个简单的示例,展示如何在 PostgreSQL 中使用事务和 MVCC: ```sql -- 开始一个事务 BEGIN; -- 查询某个表的数据 SELECT * FROM my_table WHERE id = 1; -- 更新数据 UPDATE my_table SET value = 'new_value' WHERE id = 1; -- 提交事务 COMMIT; ``` 在这个示例中,PostgreSQL 会为每个事务生成一个独立的 ReadView,确保事务内的读取操作能够看到一致的数据版本。更新操作会生成新的数据版本,而旧版本的数据仍然可供其他事务读取,直到当前事务提交。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值