首页 > Linux操作系统 > Linux操作系统 > APPEND时的TM锁定级别
朋友问他们INSERT由于TM锁阻塞了其他会话的UPDATE语句
听到的第一个反应的外键列没有索引,当是他说没外键索引的这个问题
根据他给我东西看:
SID ID1 ID2 LMODE REQUEST TY
------------------------------ ---------- ---------- ---------- ---------- --
HOLDER:1510 66571 0 6 0 TM
WAITER:104 66571 0 0 3 TM
WAITER:118 66571 0 0 3 TM
WAITER:353 66571 0 0 3 TM
WAITER:546 66571 0 0 3 TM
TM6阻塞了TM3,TM6是独占锁,应该是在DDL语句时候才会有的,又让他给我看捕获的语句
INSERT /*+ APPEND */ INTO ACPDR ( SELECT A.*, DECODE( B.DOCID, N
UPDATE acpdr SET CHKFLG=1,LSERIAL_NO='bp_tmpdata_1_tb;328506139'
UPDATE acpdr SET CHKFLG=1,LSERIAL_NO='bp_tmpdata_1_tb;328519175'
一看到这个APPEND我就觉得不对,估计是这个提示的原因,让他查了下,ID1 66571是表acpdr的P10分区
自己测试了下:
SQL> INSERT INTO test SELECT * FROM dba_objects;
6940 rows inserted
SQL> SELECT * FROM v$lock WHERE sid=(SELECT sid FROM v$mystat WHERE ROWNUM=1);
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
52F7F8E8 52F7F9F4 16 TX 1048608 37 6 0 30 0
52F4D1D4 52F4D1E8 16 TM 7608 0 3 0 30 0
SQL> INSERT /*+append*/ INTO test SELECT * FROM dba_objects;
6940 rows inserted
SQL> SELECT * FROM v$lock WHERE sid=(SELECT sid FROM v$mystat WHERE ROWNUM=1);
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
52F7F8E8 52F7F9F4 16 TX 1048608 37 6 0 51 0
52F4D1D4 52F4D1E8 16 TM 7608 0 6 0 6 0
可以看到,APPEND确实是用TM6来锁表的。估计用TM6的原因是,APPEND是在高水位线上直接插入,为了回滚的需求而需要的(在回滚时,直接从位图中删除分配的盘区信息)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8242091/viewspace-615357/ ,如需转载,请注明出处,否则将追究法律责任。