10.3.6.2.4 TX enqueue:
那些是排他的当一个事务开始它的第一次改变持有知道COMMIT或者ROLLBACK:
Waits for TX in mode 6:
发生当一个session 是等待一个row level lock 被其他session持有。
这个发生在一个yoghurt是更新或者删除一个记录, 另外一个session需要来更新或者删除。
这类TX enqueue 等待对应于 wait event enq: TX - row lock contention.
解决方案是第一个持有lock的session执行一个COMMIT或者ROLLBACK
SESSION 1:
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
1178 0 0
SQL> update test set id=200 where id=2;
已更新 1 行。
SESSION 2:
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
584 0 0
SQL>
SQL> update test set id=300 where id=2; --hang
SQL> select * from v$lock a where sid in (1178,584) and type in ('TM','TX');
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00000001840D1910 00000001840D1968 584 TX 196631 47429 0 6 81 0
00007FB180654A68 00007FB180654AC8 584 TM 99891 0 3 0 81 0
00007FB180654A68 00007FB180654AC8 1178 TM 99891 0 3 0 131 0
000000017F752FA0 000000017F753018 1178 TX 196631 47429 6 0 131 1
SQL> select sid, SERIAL#, USERNAME,p1,p2,p3,event, BLOCKING_SESSION from v$session where sid in (1178,584);
SID SERIAL# USERNAME P1 P2 P3 EVENT BLOCKING_SESSION
---------- ---------- ------------------------------ ---------- ---------- ---------- ---------------------------------------------------------------- ----------------
584 49455 QUERY 1415053318 196631 47429 enq: TX - row lock contention 1178
1178 53813 QUERY 1650815232 1 0 SQL*Net message from client
SQL>