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
取 消