资源描述:
《rebuildindexonline的锁机制浅析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、一般都说,rebuildindexonline不阻塞DML操作,这是相对于rebuildindex来说的,加上了online,只是在rebuild的期间不阻塞DML,但是在开始和结束阶段还是可能阻塞其他进程的DML的,要弄清楚到底是阻塞还是不阻塞,何处阻塞,为什么阻塞,还是要从锁的角度来分析。本文实验环境为Oracle10.2.0.4。Oracle中的锁,一共有6两种模式:0:none1:null空2:Row-S行共享(RS):共享表锁,subshare3:Row-X行独占(RX):用于行的修改,sube
2、xclusive4:Share共享锁(S):阻止其他DML操作,share5:S/Row-X共享行独占(SRX):阻止其他事务操作,share/subexclusive6:exclusive独占(X):独立访问使用,exclusive我们知道,DML操作一般要加两个锁,一个是对表加模式为3的TM锁,一个是对数据行的模式为6的TX锁。只要操作的不是同一行数据,是互不阻塞的。但是rebuildindexonline在开始和结束的时候是需要对表加一个模式为4的TM锁的,这个可以很容易通过实验观察到,实验中的测试
3、表t是通过createtabletasselect*fromall_objects生成,并且多次执行insertintotselect*fromt产生较多的数据,以便延迟rebuild的时间来观察系统中锁的情况:session1:SQL>deletefromtwhereobject_id=28;1rowdeleted.session2:SQL>alterindexix_trebuildonline;Session2被阻塞,会话挂起,这时查询v$lock,可以得到如下结果:SQL>selectsid,typ
4、e,id1,id2,lmode,requestfromv$lockwheretypein('DL','TM','TX');SIDTYID1ID2LMODEREQUEST----------------------------------------------------1643DL105990301643DL105990301622TM105990301643TM105990241643TM106070401622TX655398136160从上面的结果可以知道,1622是session1,1643是s
5、ession2,session2一共出现了4个锁,两个DL锁,一个针对表t的TM锁,一个是onlinerebuildindex时需要的一个中间表的TM锁,中间表用于记录rebuild期间的增量数据,原理类似于物化视图日志,其object_id为10607,这是一个索引组织表(IOT),从这里我们也可以发现IOT的优点和适合的场合,这张中间表只有插入,不会有删除和修改操作,而且只有主键条件查询,正是IOT最合适的场景:SQL>selectobject_name,object_typefromall_obje
6、ctswhereobject_id=10607;OBJECT_NAMEOBJECT_TYPE-------------------------------------------------SYS_JOURNAL_10602TABLESQL>selecttable_name,iot_typefromall_tableswheretable_name='SYS_JOURNAL_10602';TABLE_NAMEIOT_TYPE-----------------------------------------
7、-SYS_JOURNAL_10602IOTSession2在请求一个模式为4的TM锁,模式4会阻塞这个表上的所有DML操作,所以这是再往这个表上执行DML也会挂起session3:SQL>deletefromtwhereobject_id=46;SQL>selectsid,type,id1,id2,lmode,requestfromv$lockwheretypein('DL','TM','TX');SIDTYID1ID2LMODEREQUEST-------------------------------
8、---------------------1643DL105990301643DL105990301622TM105990301643TM105990241643TM106070401627TM105990031622TX6553981361601627就是session3,请求模式为3的TM锁无法获得,会话被阻塞。这是因为锁请求是需要排队的,即使session3和session1是可以并发的,但由于session2先请求锁并