Here I'll show you how to find on which row is waiting blocked session in Oracle Database when you have row level lock (enq: TX - row lock contention).
Let's Demonstrate small demo
Session 1
SQL> select * from scott.dept;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> update scott.dept set loc='SESSION1' where deptno=10;
1 row updated
Session 2
SQL> select * from scott.dept;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> update scott.dept set loc='SESSION2' where deptno=10;
Now second session waiting for first session because there is row lock on table scott.dept and we need to find on which row is waiting second session
SQL> select sid, event from gv$session where event like 'enq%';
SID EVENT
---------- ----------------------------------------------------------------
133 enq: TX - row lock contention
SQL> column owner format a10
SQL> column object_name format a12
SQL> column row_wait_obj# format a10
SQL> column row_wait_file# format a6
SQL> column row_wait_block# format a8
SQL> select o.owner,
o.object_name,
row_wait_obj#,
row_wait_file#,
row_wait_block#,
row_wait_row#,
dbms_rowid.rowid_create(1,
o.DATA_OBJECT_ID,
ROW_WAIT_FILE#,
ROW_WAIT_BLOCK#,
ROW_WAIT_ROW#) as "RowID"
from gv$session s,
dba_objects o
where sid = 133 ---- waiting session id
and s.ROW_WAIT_OBJ# = o.OBJECT_ID;
OWNER OBJECT_NAME ROW_WAIT_O ROW_WA ROW_WAIT ROW_WAIT_ROW# RowID
---------- ------------ ---------- ------ -------- ------------- ------------------
SCOTT DEPT 75333 4 135 0 AAASZFAAEAAAACHAAA
SQL> select * from scott.dept where rowid='AAASZFAAEAAAACHAAA';
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
SQL>
No comments:
Post a Comment