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>
