达梦数据库多版本并发控制
- 1 多版本并发控制解决了什么问题?
- 2 达梦MVCC实现方式
- 2.1 版本链结构
- 2.1.1 物理记录
- 2.1.2 回滚记录
- 2.1.3 版本链实现方式
- 2.2 可见性原则
- 2.3 历史数据获取
1 多版本并发控制解决了什么问题?
MVCC(Multi-Version Concurrency Control)的核心思想是通过数据版本化实现读写操作的隔离。与传统的锁机制不同,MVCC允许读操作在不阻塞写操作的情况下进行(反之亦然),从而显著提升并发性能。
mvcc是解决高并发场景下的性能问题,在确保数据一致性、隔离性前提下,性能还更高
例如
传统锁机制:
当多个事务同时读写同一数据时,锁机制可能导致严重的资源竞争(如读阻塞写、写阻塞读),甚至死锁问题。
/
MVCC:
每个事务看到的是数据在某个时间点的快照(Snapshot),读写操作无需互斥,天然避免了大部分锁竞争。
2 达梦MVCC实现方式
DM 数据库基于物理记录和回滚记录实现行级多版本支持,数据页中只保留物理记录的最新版本,通过回滚记录维护历史版本
所有事务针对特定的版本进行操作
2.1 版本链结构
2.1.1 物理记录
物理记录存储在数据页中
格式
物理记录 | TID | RPTR |
---|
物理记录:目前数据库中业务数据的最新版本
TID: 修改记录的事务号
PRTR:回滚段中上一个版本回滚记录的物理地址(类似于指针,指向回滚段中的前一个版本的地址)
2.1.2 回滚记录
数据行的旧版本存储在UNDO日志中(回滚记录中),避免主表空间膨胀。
格式
回滚记录 | TID | RPTR |
---|
回滚记录:数据的历史版本
TID: 回滚记录对应的事务号
PRTR:回滚段中上一个版本回滚记录的物理地址(再指向回滚记录的上一个版本)
2.1.3 版本链实现方式
通过物理记录和回滚记录的PRTR实现链表结构
每行数据(记录)都包含多个版本,版本之间通过PRTR(指针)链接,形成链表结构。
RPTR 字段起到了关键的链接作用。无论是插入、更新还是删除操作,RPTR 都确保了能够建立起不同版本记录之间的关联链条
TID 字段则为追踪事务操作提供了便利,方便在回滚等操作时确定是由哪个事务引发的相应操作。
2.2 可见性原则
每行数据(记录)都包含多个版本,但是事务能够看见哪个版本(能够对哪个版本进行查询或操作),是实现多版本控制的关键;
DM 通过活动事务表,来确定事务的可见性。
每个活动事务都对应有一个活动事务视图,根据事务隔离级的不同,在事务启动时(串行化),或者语句执行时(读提交),都要重构活动事务表(根据隔离级别不同,重构时机会有区别),收集这一时刻所有活动事务,并记录系统中即将产生的事务号NEXT_TID、MIN_TRXID
/
活动事务视图主要记录该事务启动时:
- 从IID系统获取的该事务新TRXID(当前事务id)
- 当前事务系统中的所有其它活动事务的TRXID
- 当前IID系统的下一TRXID——NEXT_TRXID(系统中下一个事务id)
- 该事务及其活动事务视图中的最小TRXID——MIN_TRXID(最小的活动事务)
DM 多版本可见性的三个原则:
1.物理记录的 TRXID 等于当前事务号,说明是本事务修改的物理记录,物理记录可见;
解释
本事务修改的物理记录是可见的,自己的数据肯定可见
2.物理记录的 TRXID 不在活动事务表中,并且 TRXID 小于 NEXT_TID,物理记录可见;
解释
事务号id是小于系统中的下一个事务id,并且不在活动事务表中,证明事务已经提交完成,已提交的数据可见
3.物理记录的 TRXID 包含在活动事务表中,或者 TRXID 大于等于 NEXT_TID,物理记录不可见;
解释
1.事务还未提交的数据不可见
2.事务id>=系统中的下一个事务id,证明是在本事务开始后的事务,不可见
总结
可见: 已提交的数据可见,并且自己能看到自己修改的数据
不可见: 未提交的事务不可见,当前事务后开启的事务不可见
2.3 历史数据获取
根据版本的tid字段,通过可见性原则判断
如可见 即获取到了满足当前事务的历史版本数据;
如不可见 则根据 RPTR 指针继续向前回溯。
如果一直不能找到对当前事务的可见版本(例如此记录是一个活动事务插入的新记录),则此记录将不会添加到查询结果集中。
更多其他数据库相关专栏:
1.数据库优化
数据库优化基本思路、索引详解、执行计划、统计信息、CBO原理、单表优化、多表优化、分布式优化、子查询、优化案例等
数据库优化(sql优化)专栏连接
2.达梦分布式数据库:
部署详细步骤(DEM)、备份还原实战、核心特性理解、使用心得、表分区方式详细介绍、表分区最佳实践、DPC架构详解等
达梦分布式DPC专栏连接
3.应用开发类
jdbc、hibernate、ibatis、mybatis、MyBatis-Plus、Spring、中间件mycat、Sharding-JDBC等
达梦数据库应用开发专栏连接