注册
【与达梦同行】达梦数据库的MVCC
技术分享/ 文章详情 /

【与达梦同行】达梦数据库的MVCC

杨凯同学 2022/12/25 2384 2 1

一、什么是MVCC

Multiversion Concurrency Control,简称 MVCC。
是通过保存数据在某个时间点的快照来实现并发控制的。也就是说,不管事务执行多长时间,事务内部看到的数据是不受其它事务影响的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。
主要有2大功能:
	读不阻塞写,写不阻塞读
	提供快照读(一致性读)的功能

二、达梦数据库多版本并发控制

DM 数据库基于物理记录和回滚记录实现行级多版本支持,
数据页中只保留物理记录的最新版本,
通过回滚记录维护历史版本,所有事务针对特定的版本进行操作。
例如,当对一个事务对表进行查询时,另一个对表更新的事务就必须等待。DM 数据库的多版本实现完全消除了行锁对系统资源的消耗,查询永远不会被阻塞也不需要上行锁,并通过 TID 锁机制消除了插入、删除、更新操作的行锁。数据库的读操作与写操作不会相互阻塞,并发度大幅度提高。

2.1 DM物理记录结构

为了适应多版本机制,高效地获取历史记录,每一条物理记录中包含了两个字段:TID和 RPTR。
TID 保存修改记录的事务号,RPTR 保存回滚段中上一个版本回滚记录的物理地址。插入、删除和更新物理记录时。
RPTR 指向操作生成的回滚记录的物理地址。物理记录格式如下:

image.png

2.2DM可见性规则

实现多版本控制的关键是可见性判断,找到对当前事务可见的特定版本数据。DM 通过活动事务表,确定事务的可见性。根据事务隔离级的不同,在事务启动时(串行化),或者语句执行时(读提交),收集这一时刻所有活动事务,并记录系统中即将产生的事务号NEXT_TID。
DM 多版本可见性原则:
(1) 物理记录的 TRXID 等于当前事务号,说明是本事务修改的物理记录,物理记录可见;
(2) 物理记录的 TRXID 不在活动事务表中,并且 TRXID 小于 NEXT_TID,物理记录可见;
(3) 物理记录的 TRXID 包含在活动事务表中,或者 TRXID 大于等于 NEXT_TID,物理记录不可见;


下面我们通过实验演示下:
--查看当前事务隔离级别
SQL> select isolation from v$trx;

LINEID     ISOLATION  
---------- -----------
1          1

used time: 1.048(ms). Execute id is 700.


--窗口一:查看当前记录
SQL> select TRXID,id,name from yangkai1.tb1
 where 		id=1;

LINEID     TRXID                ID          NAME  
---------- -------------------- ----------- ------
1          7520780              1           杨凯

used time: 0.289(ms). Execute id is 1413.


--窗口二:查看当前记录
SQL> select TRXID,id,name from yangkai1.tb1
where id=1;

LINEID     TRXID                ID          NAME  
---------- -------------------- ----------- ------
1          7520780              1           杨凯

used time: 0.336(ms). Execute id is 3503.

窗口一:执行update 操作不提交
image.png

窗口二:查询
image.png

结论:同一条查询语句在窗口一和窗口二结果显示为什么会不一致?
这就用到了可见性原则。

窗口一物理记录的TRXID:7521581
窗口二物理记录的TRXID:7520780
--查询当前事务号和NEXT_TID

image.png

因为窗口一物理记录的TRXID:7521581=当前事务号:7521581,
所以在能在本事务里看见,其他事务里看不见。
因为窗口二物理记录的TRXID:7520780不在当前事务中
并且小NEXT_TID,所以物理记录可见;


达梦MVCC:
• 达梦数据库MVCC实现⽅式:基于事务ID;
• 实现粒度:⾏级;

相关动态视图
• 显示所有活动事务的信息:V$TRX
• 显示事务等待信息:V$TRXWAIT
• 显示活动事务视图信息:V$TRX_VIEW
• 显示当前系统中锁的状态:V$LOCK
• 显示死锁的历史信息:V$DEADLOCK_HISTORY
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服