Oracle database locks enqueue



Today i receive a monitor alert about some locks in one of the databases i manage, so i run this query because is faster than traditional queries based in v$lock view:

SQL> SELECT * FROM dba_waiters where MODE_HELD <>'None' or MODE_REQUESTED <>'Share';

WAITING_SESSION HOLDING_SESSION LOCK_TYPE                  MODE_HELD                                MODE_REQUESTED                             LOCK_ID1   LOCK_ID2
--------------- --------------- -------------------------- ---------------------------------------- ---------------------------------------- ---------- ----------
            398             336 Transaction                Exclusive                                Share                                        327692    9591040
            397             336 Transaction                Exclusive                                Share                                        327692    9591040
            394             336 Transaction                Exclusive                                Share                                        327692    9591040
            373             336 Transaction                Exclusive                                Share                                        327692    9591040
            347             336 Transaction                Exclusive                                Share                                        327692    9591040
            333             336 Transaction                Exclusive                                Share                                        327692    9591040
            316             336 Transaction                Exclusive                                Share                                        327692    9591040
            294             336 Transaction                Exclusive                                Share                                        327692    9591040
            293             336 Transaction                Exclusive                                Share                                        327692    9591040
            242             336 Transaction                Exclusive                                Share                                        327692    9591040
            201             336 Transaction                Exclusive                                Share                                        327692    9591040
            197             336 Transaction                Exclusive                                Share                                        327692    9591040
            194             336 Transaction                Exclusive                                Share                                        327692    9591040
            172             336 Transaction                Exclusive                                Share                                        327692    9591040
             88             336 Transaction                Exclusive                                Share                                        327692    9591040
             57             336 Transaction                Exclusive                                Share                                        327692    9591040
             13             336 Transaction                Exclusive                                Share                                        327692    9591040

17 rows selected.


As you can see SID=336 is root blocking
So client ask me to kill this session so i killed it by doing..

SQL> SELECT SID, SERIAL#, STATUS, SERVER  FROM V$SESSION  WHERE SID=336;

  SID    SERIAL# STATUS     SERVER
----- ---------- ---------- ---------
  336      40580 ACTIVE     DEDICATED

An after get needed info to kill session i killed it:

SQL>ALTER SYSTEM KILL SESSION '=336,40580';
Statement processed.


but this session is still running due a rollback is performing... this is because when a DML is launched, Oracle makes changes to the table immediately, even if you don't commit. Old blocks are write to UNDO till you commit or rollback.
This method is good if you commit the transaction, but if you rollback, blocks have to be written back to the base table.. So, for example, imagine you have been running a DML for an hour and after that you do a rollback, then all writes to the datafiles makes during that hour must to be written back again from UNDO tablespace to original datafiles..

column SID format 9999
column SPID format 9999999
column USERNAME format a15
column PROCESS format 99999
column MACHINE format a15
column PROGRAM format a55
column STATUS format a10
col LOGON_TIME for a27

select S.INST_ID,S.SID, P.SPID, S.USERNAME, S.MACHINE, S.PROGRAM, S.STATUS, to_char(LOGON_TIME, 'Dy DD-Mon-YYYY HH24:MI:SS') LOGON_TIME from gv$session S,  gv$process P where P.addr=S.paddr and S.INST_ID=P.INST_ID and S.SID=336;SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>

   INST_ID   SID SPID         USERNAME        MACHINE         PROGRAM                                                 STATUS     LOGON_TIME
---------- ----- ------------ --------------- --------------- ------------------------------------------------------- ---------- ---------------------------
         1   336 22569        ORA_app          hostname02     serverSDM@hostname02   (TNS V1-V3)                       KILLED     Fri 29-Sep-2017 17:04:18


So after kill session, we can see it running on database in killed status...

Comments

Popular posts from this blog

Oracle Historical Session Information with ASH >10g

Purging and archiving Oracle alert.log and listener.log

Check sessions and processes limits in Oracle