达梦事物特性及MVCC
一 支持的事物隔离达梦几种隔离级别都支持默认的隔离级别是读已提交。隔离级别\数据库达梦未提交读支持已提交读支持默认可重复读支持可串行化支持隔离级别 \ 解决脏读不可重复读幻读未提交读可能可能可能已提交读不可能可能可能可重复读不可能不可能可能可串行化不可能不可能不可能二 相关验证2.1 读未提交查看当前的隔离级别select isolation from v$trx;1表示为默认的读已提交0为读未提交3为可重复读与可串行读。查看当前T1表中的数据新开会话修改当前会话隔离级别为读未提交。SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;在另一个会话中插入一行新数据不用提交回到会话1中查看数据会话1此时的会话1能够查到会话2没有提交的数据。2.2 读已提交读已提交是达梦的默认隔离级别只能查询到其他事物提交之后的数据。新开一个会话查看当前的隔离级别。select isolation from v$trx;构建T2表插入一行数据新开一个会话插入一行数据不提交。回到会话1查看是查询不到新插入的数据的。在会话2中提交后返回会话1查看会话1能看到添加的数据能够查看到了。2.3 可重复读构建新表T3并插入新的数据。新开一个会话并设置隔离为可重复读。SQL SET TRANSACTION ISOLATION LEVEL repeatable read ;操作已执行已用时间: 7.290(毫秒). 执行号:1501.SQL SELECT isolation FROM V$TRX;行号 ISOLATION---------- -----------1 3在当前会话中修改一行数据的值但是不提交。此时会话1已经正常修改。新开一个会话2并设置隔离为可重复读。在会话2中查看T3表的数据能看到还是修改之前的。此时在会话1中提交数据返回会话2再次查看。会话2看到的还是修改之前的。其他会话修改并提交的数据不会影响当前会话的读取结果。这保证了在同一个事务中多次读取同一数据时能够得到相同的结果。2.4 可串行读验证过程与结果跟可重复度类似可串行读要求消除不可重复读取和幻像读现象本身查询不会增加任何代价但是当串行化事物更新或者删除数据时其他事物会被当前事物阻塞只有当串行化事物提交或者回滚后才会释放报错“串行化事物被打断”。创建新表插入数据。SQL create table t4 (id number(10),name char(10));操作已执行已用时间: 94.853(毫秒). 执行号:2101.SQL insert into t4 values(1,AA);影响行数 1已用时间: 3.777(毫秒). 执行号:2102.SQL commit;操作已执行已用时间: 2.794(毫秒). 执行号:2103.SQL select * from t4;行号 ID NAME---------- -- ----------1 1 AA已用时间: 2.977(毫秒). 执行号:2104.新开会话1设置隔离级别为可串行读SQL SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;操作已执行已用时间: 1.634(毫秒). 执行号:2301.SQL SELECT isolation FROM V$TRX;行号 ISOLATION---------- -----------1 3已用时间: 0.197(毫秒). 执行号:2302.更新新表数据但是不提交新开一个会话2设置隔离级别为可串行读。查看T4表数据此时还是修改之前的数据在会话1中提交会话2查看还是修改之前的数据。此时在会话1中再更新一下数据不要提交。SQL update t4 set nameCC where id1;影响行数 1已用时间: 3.637(毫秒). 执行号:3006.在会话2中也修改此行发现会话卡住。在会话1中commit或者rollback之后这边会话才能结束。此时会话2出现串行化事物被打断MVCC机制达梦数据库为用户提供了两种MVCC模式通过参数TRX_VIEW_MODE控制1.基于回滚记录的MVCCTRX_VIEW_MODE0数据行包含事务TID和版本指针RPTR使得记录间单向连接形成链式版本结构。事务根据当前活动事务的视图依据链式版本结构构成可见的记录集合[]。2.基于时间戳的MVCCTRX_VIEW_MODE1全局维护一个大数组CMTARRCommit Array长度由参数TRX_CMTARR_SIZE控制单位百万。事务在启动时获取一个时间戳SNAP_CMTSEQ提交时将CMTARR中对应位置事务号的值设置为当前时间。数据版本的可见性通过比较SNAP_CMTSEQ和CMTSEQ来判断如果SNAP_CMTSEQ CMTSEQ则数据版本可见否则不可见。默认为基于时间戳的MVCC。1、进行多版本读时这个视图的使用方式是这样的在形成活动事务视图TRX_VIEW时一个事务还收集当前最下活动事务号MIN_ACTIVE_ID以及全局下一个事务号NEXT_ID。这样一个事务在读一条记录时就可以进行如下的比对记录事务ID大于等于下一个事务ID记录不可见记录事务ID等于自身事务ID记录可见记录事务ID小于当前最小已激活事务ID记录可见记录事务ID不在事务视图中记录可见记录事务ID在事务视图中记录不可见对于可见的记录则取这条记录为最终版本对于不可见的记录则通过链式版本继续向这条记录的过往版本进行上述的比对直到找到可见的版本或不取这条记录。2、DM数据库提供给用户第二种MVCC方式也是当前版本DM数据库的默认MVCC方式即基于时间戳的MVCC。这种MVCC的实现方式是全局只维护一个大数组CMTARR长度一般在千万级DM数据库令事务在启动时将这个数组中对应位置事务号上的数据CMTSEQ置为0而在事务提交时则将这个位置上的数据CMTSEQ置为当前的时间。这样的话事务或SQL启动时只需要获取一个当前的时间戳SNAP_CMTSEQ再与记录ID在CMTARR对应位置上的时间戳比对就可得出可见与否了。具体比对方式如下SNAP_CMTSEQ CMTSEQ可见SNAP_CMTSEQ CMTSEQ不可见这个大数组的长度可以由静态参数TRX_CMTARR_SIZE控制单位百万。这个参数设置 越大内存消耗越多单位时间内事务完成数量大时可将此参数值设大。DM在这种MVCC策略下对于“长事务”也有对应的处理方案。所谓“长事务”就是事务号下一个事务号-数组长度/2的事务即当前的下个事务即全局最新的事务与这个长事务间隔超过了CMTARR数组长度的一半也就是执行时间超长以至于在其执行期间由大量新事务启动的事务。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →