*** 2017-07-05 15:58:46.639
*** ksudidTrace: ksqgtl
ktcmydid(): 0001-0015-00000017
ksusesdi: 0000-0000-00000000
ksusetxn: 0001-0015-00000017
ksqgtl: RETURNS 0 --获得TM锁
*** 2017-07-05 15:58:46.639
ksqgtl *** TX-00090011-0000058b mode=6 flags=0x401 timeout=0 *** --申请持有TX锁(6号独占)
ksqgtl: xcb=0xbbeb52b8, ktcdix=2147483647, topxcb=0xbbeb52b8
ktcipt(topxcb)=0x0
*** 2017-07-05 15:58:46.639
ksucti: init session DID from txn DID:
ksqgtl:
ksqlkdid: 0001-0015-00000017
*** 2017-07-05 15:58:46.639
*** ksudidTrace: ksqgtl
ktcmydid(): 0001-0015-00000017
ksusesdi: 0000-0000-00000000
ksusetxn: 0001-0015-00000017
ksqgtl: RETURNS 0 --获得TX锁
--此时COMMIT提交
*** 2017-07-05 15:58:57.519
ksqrcl: TX,90011,58b
ksqrcl: returns 0 --释放TX锁
*** 2017-07-05 15:58:57.519
ksqrcl: TM,15b7d,0
ksqrcl: returns 0 --释放TM锁
以上即是update test_t1 set where id<5语句的锁的状态过程
分析:
TM-00015b7d-00000000 mode=3
TM锁ID1对应的是Object_ID,00015b7d(十六进制)>88957(十进制)
SQL> select object_id,object_name from dba_objects where object_id=88957;
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------------------
88957 TEST_T1
可知在update执行过程中,TEST_T1持有的是3号锁,不会堵塞DML操作。
TX-00090011-0000058b mode=6
即对应update test_t1 set where id<5语句,可见Update四行,只产生一个TX锁。
四、Offline和Online创建索引的锁的跟踪对比
这次实验观察不同sql语句下锁持有情况的不同,主要以TM锁为例
实验准备:
sqlplus / as sysdba
SQL> create table text as select * from dba_objects;
SQL> insert into text select * from text;
.....
SQL> select count(*) from text;
COUNT(*)
----------
22267136
SQL> create table text_t1 as select * from text;
SQL> select OBJECT_ID,OBJECT_NAME from dba_objects where OBJECT_NAME='TEXT_T1';
OBJECT_ID OBJECT_NAME
---------- ------------------------------------------------------------------------------------------------
89012 TEXT_T1
1.Create index
Session 1
conn cyh/oracle
SQL> select sid from v$mystat where rownum=1 确认当前会话号SID
----------
45
SQL> alter session set events '10704 trace name context forever, level 12'; 启动10704观察
SQL> create index idx_text01 on text_t1(OBJECT_ID);
Session 2
sqlplus / as sysdba
在索引创建的同时,新开个窗口观察45会话持有锁的动态
SQL> select * from v$lock where sid=45;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00000000BED5CE58 00000000BED5CEB0 45 AE 100 0 4 0 132 0
00000000BED5D1D8 00000000BED5D230 45 DL 89012 0 3 0 47 0
00000000BED5D478 00000000BED5D4D0 45 DL 89012 0 3 0 47 0
00007F2A281DC028 00007F2A281DC088 45 TM 89012 0 4 0 47 0
00007F2A281DC028 00007F2A281DC088 45 TM 18 0 3 0 47 0
00000000BBE04B08 00000000BBE04BB8 45 TS 14 29360258 6 0 21 0
00000000BBF03CC8 00000000BBF03D40 45 TX 262165 1930 6 0 47 0
Session 1
SQL> create index idx_text01 on text_t1(OBJECT_ID);
Index created.
SQL> alter session set events '10704 trace name context off';
Linux
[oracle@localhost trace]$ more orcl_ora_24114.trc 从OS从提取日志分析
TM-00015bb4-00000000 mode=4 指向TEXT_T1 开头持有结束释放 4号锁,阻塞其他事务DML操作
TM-00000012-00000000 mode=3 指向OBJ$ 多次持有多次释放
TM-0000000e-00000000 mode=3 指向SEG$ 多次持有多次释放
TM-00000014-00000000 mode=3 指向ICOL$ 仅在末尾持有和释放一次
TM-00000013-00000000 mode=3 指向IND$ 仅在末尾持有和释放一次