Wednesday, November 18, 2015
Dealing with lock contention
Inspect the active locks:
SELECT SID, ID1, ID2, BLOCK, TYPE, LMODE, REQUEST, CTIME
FROM V$LOCK
MINUS
SELECT SID, ID1, ID2, BLOCK, TYPE, LMODE, REQUEST, CTIME
FROM V$ENQUEUE_LOCK;
Verify the object on which the lock is held:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM ALL_OBJECTS
WHERE OBJECT_ID = 74136;
Query the V$LOCKED_OBJECT dynamic performance view:
SELECT * FROM V$LOCKED_OBJECT;
Query DBA_WAITERS to see which sessions are waiting due to a lock held by another session:
SELECT * FROM DBA_WAITERS;
Query DBA_BLOCKERS to see which sessions are holding a lock that is blocking another session:
SELECT * FROM DBA_BLOCKERS;
Execute the utllockt.sql script to view a tree representation of the current state of the locks:
@$ORACLE_HOME/rdbms/admin/utllockt.sql
View the object, file, block, and row locked:
SELECT
SUBSTR(F.NAME, 1, 40) AS FILE_NAME,
O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE,
S.ROW_WAIT_BLOCK#, S.ROW_WAIT_ROW#
FROM V$SESSION S, V$DATAFILE F, ALL_OBJECTS O
WHERE S.SID = 17
AND S.ROW_WAIT_FILE# = F.FILE#
AND S.ROW_WAIT_OBJ# (+)= O.OBJECT_ID;
Acquire the SERIAL# and SID of the locked session (SESSION2):
SELECT SERIAL# FROM V$SESSION WHERE SID = 17;
Kill the locked session:
ALTER SYSTEM KILL SESSION '17, 15';
Complete the transaction in SESSION1 to avoid other locking:
-- SESSION 1
ROLLBACK;
Find who is blocking who
select s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2 ;
No comments:
Post a Comment