session1 (sid 127):savepoint a;
update t1 set id=66 where id=6;
session 2(sid 136):
update t1 set id=666 where id=6;
session 1:
rollback to a;
这时,session 2 还是被阻塞中。
新开session3:
SQL> select * from v$lock where sid in (127,136);
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
3C43434C 3C434360 136 TX 786474 151 0 6 2833 0
3C37AB88 3C37ABA0 136 TM 53420 0 3 0 2833 2
3C3CAB10 3C3CAB34 127 TX 786474 151 6 0 2886 1
dump 信息:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.027.00000245 0x00806d99.01f7.14 C--- 0 scn 0x0000.00224cd2 --->这个原来就有跟实验无关,况且标志C代表已经COMMIT,所有锁释放。
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x04 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x05 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
Dump 发现,在块头已经没有相关事务ITL信息。但是v$lock中还是持有TX锁,导致阻塞。但不影响新开session的DML操作。
oracle文档说锁是存储在数据块中的,但是既然没有了锁的信息。为何还会导致阻塞?
难道说session此时需要获取的并不仅仅是数据块中的锁,还需要别的什么吗?
文档中也没有说清楚到底是怎么回事,只是说交易排队问题(Enqueued Transactions) .还是没有真正弄清楚里面的过程和机制。
请教。多谢。