达梦数据库多版本并发控制(MVCC)_yxy

1 多版本并发控制解决了什么问题?

MVCC(Multi-Version Concurrency Control)的核心思想是通过数据版本化实现读写操作的隔离。与传统的锁机制不同,MVCC允许读操作在不阻塞写操作的情况下进行(反之亦然),从而显著提升并发性能。

mvcc是解决高并发场景下的性能问题,在确保数据一致性、隔离性前提下,性能还更高

例如
传统锁机制:
当多个事务同时读写同一数据时,锁机制可能导致严重的资源竞争(如读阻塞写、写阻塞读),甚至死锁问题。
/
MVCC:
每个事务看到的是数据在某个时间点的快照(Snapshot),读写操作无需互斥,天然避免了大部分锁竞争。

2 达梦MVCC实现方式

DM 数据库基于物理记录和回滚记录实现行级多版本支持,数据页中只保留物理记录的最新版本,通过回滚记录维护历史版本
所有事务针对特定的版本进行操作

2.1 版本链结构

2.1.1 物理记录

物理记录存储在数据页中

格式

物理记录TIDRPTR

物理记录:目前数据库中业务数据的最新版本
TID: 修改记录的事务号
PRTR:回滚段中上一个版本回滚记录的物理地址(类似于指针,指向回滚段中的前一个版本的地址)

2.1.2 回滚记录

数据行的旧版本存储在UNDO日志中(回滚记录中),避免主表空间膨胀。

格式

回滚记录TIDRPTR

回滚记录:数据的历史版本
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等
达梦数据库应用开发专栏连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值