Session 1 starts UPDATE and nothing else.
++++++++++ Session 1: 02:53:39 ARROW:(MDINH@leo):PRIMARY> update t set object_id=100; 1 row updated. 02:53:45 ARROW:(MDINH@leo):PRIMARY> ++++++++++ Session 2: 02:53:50 ARROW:(SYSTEM@leo):PRIMARY> update mdinh.t set object_id=2; ++++++++++ Session 3: 02:53:58 ARROW:(DEMO@leo):PRIMARY> update mdinh.t set object_id=200; ++++++++++
Monitor blocking locks
$ sysdba @b.sql SQL*Plus: Release 11.2.0.4.0 Production on Sat Aug 6 02:55:03 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning and Real Application Testing options STATE USERNAME SID_SERIAL SQL_ID SEQ# EVENT STATUS MIN MACHINE OSUSER PROGRAM ---------- --------------- ------------ ------------- ------ -------------------- -------- ---- -------------------- ---------- --------------- BLOCKING MDINH 22,1947 57 SQL*Net message from INACTIVE 1 arrow.localdomain oracle sqlplus@arrow.l WAITING *DEMO 27,487 0sst1nnb8vw49 45 enq: TX - row lock c ACTIVE 1 arrow.localdomain oracle sqlplus@arrow.l WAITING *SYSTEM 35,795 dh603ks5ggumy 45 enq: TX - row lock c ACTIVE 1 arrow.localdomain oracle sqlplus@arrow.l STATE USERNAME SQL_ID SQL_TEXT ---------- --------------- ------------- -------------------------------------------------------------------------------- BLOCKING MDINH 6827jhnufmcfx update t set object_id=100 WAITING *DEMO 0sst1nnb8vw49 update mdinh.t set object_id=200 WAITING *SYSTEM dh603ks5ggumy update mdinh.t set object_id=2 ARROW:(SYS@leo):PRIMARY> select sql_id, prev_sql_id from v$session where sid=22; SQL_ID PREV_SQL_ID ------------- ------------- 6827jhnufmcfx ARROW:(SYS@leo):PRIMARY>
Blocking session is INACTIVE and the UPDATE SQL is available.
.
Session 1 execute SELECT following UPDATE.
++++++++++ Session 1: 02:56:16 ARROW:(MDINH@leo):PRIMARY> select sysdate from dual; SYSDATE ------------------- 2016-08-06 02:56:23 02:56:23 ARROW:(MDINH@leo):PRIMARY> ++++++++++
Monitor blocking locks
ARROW:(SYS@leo):PRIMARY> @b STATE USERNAME SID_SERIAL SQL_ID SEQ# EVENT STATUS MIN MACHINE OSUSER PROGRAM ---------- --------------- ------------ ------------- ------ -------------------- -------- ---- -------------------- ---------- --------------- BLOCKING MDINH 22,1947 7h35uxf5uhmm1 61 SQL*Net message from INACTIVE 0 arrow.localdomain oracle sqlplus@arrow.l WAITING *DEMO 27,487 0sst1nnb8vw49 45 enq: TX - row lock c ACTIVE 3 arrow.localdomain oracle sqlplus@arrow.l WAITING *SYSTEM 35,795 dh603ks5ggumy 45 enq: TX - row lock c ACTIVE 3 arrow.localdomain oracle sqlplus@arrow.l STATE USERNAME SQL_ID SQL_TEXT ---------- --------------- ------------- -------------------------------------------------------------------------------- BLOCKING MDINH 7h35uxf5uhmm1 select sysdate from dual WAITING *DEMO 0sst1nnb8vw49 update mdinh.t set object_id=200 WAITING *SYSTEM dh603ks5ggumy update mdinh.t set object_id=2 ARROW:(SYS@leo):PRIMARY> select sql_id, prev_sql_id from v$session where sid=22; SQL_ID PREV_SQL_ID ------------- ------------- 7h35uxf5uhmm1 7h35uxf5uhmm1 ARROW:(SYS@leo):PRIMARY>
Note: SQL_ID=PREV_SQL_ID and SQL is not the blocking SQL.
ARROW:(SYS@leo):PRIMARY> !cat b.sql
col username for a15 trunc
col state for a10 trunc
col osuser for a10 trunc
col program for a15 trunc
col sid_serial for a12 trunc
col event for a20 trunc
col machine for a20 trunc
col sid for 999999
col wait_min for 999
col sql_text for a100 trunc
col seq# for 99999
col min for 999
col sql_text for a80 trunc
set lines 200 pages 10000 tab off trimspool off
SELECT
decode(level,1,'BLOCKING','WAITING') state,
LPAD('*',(level-1)*1,' ') || NVL(s.username,'(oracle)') AS username,
s.sid||','||s.serial# sid_serial,
sql_id,
s.seq#,
s.event,
s.status,
round(s.last_call_et/60) min,
s.machine,
s.osuser,
s.program
FROM v$session s
WHERE level > 1
OR EXISTS (SELECT null FROM v$session WHERE blocking_session = s.sid)
CONNECT BY PRIOR s.sid = s.blocking_session
START WITH s.blocking_session IS NULL
order by 1,2
;
---
with s as (
SELECT
decode(level,1,'BLOCKING','WAITING') state,
LPAD('*',(level-1)*1,' ') || NVL(s.username,'(oracle)') AS username,
decode(status,'INACTIVE',prev_sql_id,sql_id) sql_id
FROM v$session s
WHERE level > 1
OR EXISTS (SELECT null FROM v$session WHERE blocking_session = s.sid)
CONNECT BY PRIOR s.sid = s.blocking_session
START WITH s.blocking_session IS NULL
)
SELECT s.state, s.username, s.sql_id, sql_text
FROM v$sqlarea a, s
WHERE a.sql_id=s.sql_id
order by 1,2
;
ARROW:(SYS@leo):PRIMARY>
Nice Script from Jeffrey M. Hunter
http://www.idevelopment.info/data/Oracle/DBA_scripts/Locks/locks_blocking.sql
$ sysdba @locks_blocking.sql
SQL*Plus: Release 11.2.0.4.0 Production on Sat Aug 6 03:12:55 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning and Real Application Testing options
+------------------------------------------------------------------------+
| Report : Blocking Locks |
| Instance : leo |
+------------------------------------------------------------------------+
+------------------------------------------------------------------------+
| BLOCKING LOCKS (Summary) |
+------------------------------------------------------------------------+
Number of blocking lock incidents: 2
Incident 1
---------------------------------------------------------------------------------------------------------
WAITING BLOCKING
---------------------------------------- ----------------------------------------
Instance Name : leo leo
Oracle SID : 27 22
Serial# : 487 1947
Oracle User : DEMO MDINH
O/S User : oracle oracle
Machine : arrow.localdomain arrow.localdomain
O/S PID : 20525 20521
Terminal : pts/3 pts/2
Lock Time : 19 minutes 19 minutes
Status : ACTIVE INACTIVE
Program : sqlplus@arrow.localdomain (TNS V1-V3) sqlplus@arrow.localdomain (TNS V1-V3)
Waiter Lock Type : Transaction
Waiter Mode Request : Exclusive
Waiting SQL : update mdinh.t set object_id=200
Incident 2
---------------------------------------------------------------------------------------------------------
WAITING BLOCKING
---------------------------------------- ----------------------------------------
Instance Name : leo leo
Oracle SID : 35 22
Serial# : 795 1947
Oracle User : SYSTEM MDINH
O/S User : oracle oracle
Machine : arrow.localdomain arrow.localdomain
O/S PID : 20706 20521
Terminal : pts/7 pts/2
Lock Time : 19 minutes 19 minutes
Status : ACTIVE INACTIVE
Program : sqlplus@arrow.localdomain (TNS V1-V3) sqlplus@arrow.localdomain (TNS V1-V3)
Waiter Lock Type : Transaction
Waiter Mode Request : Exclusive
Waiting SQL : update mdinh.t set object_id=2
+------------------------------------------------------------------------+
| LOCKED OBJECTS |
+------------------------------------------------------------------------+
Instance SID / Serial# Status Locking Oracle User Object Owner Object Name Object Type Locked Mode
--------- --------------- --------- -------------------- --------------- ------------------------- --------------- -------------------------
leo 22 / 1947 INACTIVE MDINH MDINH T TABLE Row-Exclusive (SX)
leo 27 / 487 ACTIVE DEMO MDINH T TABLE Row-Exclusive (SX)
leo 35 / 795 ACTIVE SYSTEM MDINH T TABLE Row-Exclusive (SX)
ARROW:(SYS@leo):PRIMARY>