Multiversion Concurrency Control,简称 MVCC。
是通过保存数据在某个时间点的快照来实现并发控制的。也就是说,不管事务执行多长时间,事务内部看到的数据是不受其它事务影响的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。
主要有2大功能:
读不阻塞写,写不阻塞读
提供快照读(一致性读)的功能
DM 数据库基于物理记录和回滚记录实现行级多版本支持,
数据页中只保留物理记录的最新版本,
通过回滚记录维护历史版本,所有事务针对特定的版本进行操作。
例如,当对一个事务对表进行查询时,另一个对表更新的事务就必须等待。DM 数据库的多版本实现完全消除了行锁对系统资源的消耗,查询永远不会被阻塞也不需要上行锁,并通过 TID 锁机制消除了插入、删除、更新操作的行锁。数据库的读操作与写操作不会相互阻塞,并发度大幅度提高。
为了适应多版本机制,高效地获取历史记录,每一条物理记录中包含了两个字段:TID和 RPTR。
TID 保存修改记录的事务号,RPTR 保存回滚段中上一个版本回滚记录的物理地址。插入、删除和更新物理记录时。
RPTR 指向操作生成的回滚记录的物理地址。物理记录格式如下:
实现多版本控制的关键是可见性判断,找到对当前事务可见的特定版本数据。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 操作不提交
窗口二:查询
结论:同一条查询语句在窗口一和窗口二结果显示为什么会不一致?
这就用到了可见性原则。
窗口一物理记录的TRXID:7521581
窗口二物理记录的TRXID:7520780
--查询当前事务号和NEXT_TID
因为窗口一物理记录的TRXID:7521581=当前事务号:7521581,
所以在能在本事务里看见,其他事务里看不见。
因为窗口二物理记录的TRXID:7520780不在当前事务中
并且小NEXT_TID,所以物理记录可见;
达梦MVCC:
• 达梦数据库MVCC实现⽅式:基于事务ID;
• 实现粒度:⾏级;
相关动态视图
• 显示所有活动事务的信息:V$TRX
• 显示事务等待信息:V$TRXWAIT
• 显示活动事务视图信息:V$TRX_VIEW
• 显示当前系统中锁的状态:V$LOCK
• 显示死锁的历史信息:V$DEADLOCK_HISTORY
文章
阅读量
获赞