144 TM 52896 26 0
144 TM 52899 827 0
144 TS 7 26 0
144 TX 262169 26 0
148 TX 589847 26 0
已选择8行。
SQL> SELECT EVENT, P1TEXT, P1, SECONDS_IN_WAIT FROM V$SESSION_WAIT WHERE SID = 144;
EVENT P1TEXT P1 SECONDS_IN_WAIT
---------------------------------------- -------------------- ---------- ---------------
enq: TM - contention name|mode 1414332420 38
再次查询,发现会话2仍然在等待锁信息,不过等待时间已经重新计算了。观察V$LOCK视图的信息可以发现会话2仍然是被锁住,但是状态已经和第一次不相同了。根据文档的描述,ONLINE REBUILD在开始和完成的时候都会去获取锁,现在应该是等待完成时的锁。
SQL> COMMIT;
提交完成。
SQL> DELETE T WHERE ID = 3;
已删除 1 行。
在会话1再次执行COMMIT加DELETE操作,发现会话2的REBUILD操作已经完成。
索引已更改。
SQL2> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
再来看11g中的情况:
SQL> CONN YANGTK/yangtk@ORA11G已连接。
SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;
表已创建。
SQL> CREATE INDEX IND_T_NAME ON T(OBJECT_NAME);
索引已创建。
SQL> DELETE T WHERE ID = 1;
已删除 1 行。
模仿上面的例子,在会话1中保持锁。会话2执行ONLINE REBUILD INDEX处于等待锁的状态。
SQL2> CONN YANGTK/yangtk@ORA11G已连接。
SQL2> ALTER INDEX IND_T_NAME REBUILD ONLINE;
IXDBA.NET社区论坛在会话1中查询会话2的等待情况和锁占有情况:
SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;
SID
----------
131
SQL> SELECT SID FROM V$SESSION WHERE USERNAME = 'YANGTK';
SID
----------
131
149
SQL> SELECT SID, TYPE, ID1, CTIME, BLOCK FROM V$LOCK WHERE SID IN (131, 149);
SID TY ID1 CTIME BLOCK
---------- -- ---------- ---------- ----------
149 AE 99 50 0
149 OD 70713 47 0
131 AE 99 78 0
149 DL 70712 47 0
149 DL 70712 47 0
149 OD 70712 47 0
149 TX 589851 47 0
149 TM 70712 47 0
149 TM 70715 47 0
131 TM 70712 65 0
149 TX 262171 47 0
131 TX 589851 65 1
已选择12行。
SQL> SELECT EVENT, P1TEXT, P1, SECONDS_IN_WAIT FROM V$SESSION_WAIT WHERE SID = 149;
EVENT P1TEXT P1 SECONDS_IN_WAIT
---------------------------------------- -------------------- ---------- ---------------
enq: TX - row lock contention name|mode 1415053316 77
在11g中,会话2等待的是行级锁信息,尝试在会话1中提交并马上删除: