Query to check blocking and waiting sessions
SELECT holding_session bsession_id, waiting_session wsession_id,
b.username busername, a.username wusername, c.lock_type type,
mode_held, mode_requested, lock_id1, lock_id2
FROM sys.v_$session b, sys.dba_waiters c, sys.v_$session a
WHERE c.waiting_session=a.sid and c.holding_session=b.sid
To Find which session is blocking other sessions with some system info
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 ;
Lock type and the ID1 / ID2 columns
The first place to look is the TYPE column. There are only three types of user locks, TX, TM and UL. UL is a user-defined lock — a lock defined with the DBMS_LOCK package. The TX lock is a row transaction lock; it’s acquired once for every transaction that changes data, no matter how many objects you change in that transaction. The ID1 and ID2 columns point to the rollback segment and transaction table entries for that transaction.
The TM lock is a DML lock. It’s acquired once for each object that’s being changed. The ID1 column identifies the object being modified.
Selecting locking information using v$lock, v$session, dba_objects. First look up for rows with block > 0. Pick the sid and look for rows having same id1(one row should have sid that has another row with block > 0). Create rowid using sid identified earlier as blocking session. Using rowid look up the row in the table.
select * from v$lock
select object_name from dba_objects where object_id=68046
select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#
from v$session where sid=135select do.object_name,
row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,
dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )
from v$session s, dba_objects do
where sid=135
and s.ROW_WAIT_OBJ# = do.OBJECT_ID ;select * from sys.tstlock where rowid = ‘AAAQnOAABAAAQ9yAAA’
For RAC
SELECT substr(DECODE(request,0,’Holder: ‘,’Waiter: ‘)||sid,1,12) sess,
id1, id2, lmode, request, type, inst_id
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
ORDER BY id1, request;
Isolation Levels are how Oracle executes SQL statements in regards to read consistency and is directly related to what lockmay be ignored.
- Read Committed (Default)
- Serializable Transactions
- Read-only
Read Committed: Each query executed by a transaction sees only data that was committed before the query (not the transaction) began.
Serializable Transaction: See only those changes that were committed at the time the transaction began, plus those changes made by the transaction itself through INSERT, UPDATE, and DELETE statements.
Read-Only: See only those changes that were committed at the time the transaction began and do not allow INSERT, UPDATE, and DELETE statements.
Oracle Lock Modes
- Exclusive Lock Mode
- Share Lock Mode
Exclusive Lock Mode: Prevents the associates resource from being shared. This lockmode is obtained to modify data. The first transaction to lock a resource exclusively is the only transaction that can alter the resource until the exclusive lock is released.
Share Lock Mode: Allows the associated resource to be shared, depending on the operations involved. Multiple users reading data can share the data, holding share locks to prevent concurrent access by a writer (who needs an exclusive lock). Several transactions can acquire share locks on the same resource.
Oracle Lock Types
- DML locks (data locks)
- DDL locks (dictionary locks)
- Oracle Internal Locks/Latches
- Oracle Distributed Locks
- Oracle Parallell Cache Management Locks
Oracle DML Lock Types
- Row Level Locks
- Table Level Locks
Oracle Row Locks [TX]
- All DML locks Oracle acquires automatically are row-level locks.
- No limit to the number of row locks held by a transaction.
- Oracle does not escalate locks from the row level.
- Row locking provides the lowest level of locking possible provides the best possible transaction concurrency.
- Readers of data do not wait for writers of the same data rows.
- A modified row is always locked exclusively so that other users cannot modify the row until the transaction holding the lock is committed or rolled back.
- If a transaction obtains a row lock for a row, the transaction also acquires a table lock for the corresponding table. The table lock prevents conflicting DDL operations that would override data changes in a current transaction.
Oracle Table Level Lock [TM]
- A transaction acquires a table lock for DML statements such as INSERT/UPDATE/DELETE, SELECT with the FOR UPDATE, and LOCK TABLE. Reasons are to reserve DML access to the table on behalf of a transaction and prevent DDL operations
- Table locks prevent the an exclusive DDL lock on the same table which prevents DDL operations. Example, a table cannot be altered or dropped if any uncommitted transaction holds a table lock for it.
- A table lock can be held in several modes: row share (RS), row exclusive (RX), share (S), share row exclusive (SRX), and exclusive (X).
Oracle DDL Lock Modes
- Exclusive DDL Locks
- Shared DDL Locks
- Breakable Parse Locks
Oracle Latches
- Latches are low-level serialization mechanisms to protect shared data structures in the system global area (SGA). Latches protect the oracle lists like list of users currently accessing the database and protect the data structures describing the blocks in the buffer cache. A server or background process acquires a latch for a very short time while manipulating or looking at one of these structures. The implementation of latches is operating system dependent, particularly in regard to whether and how long a process will wait for a latch.
Oracle Internal Locks
- Data Dictionary Locks
- Held on entries in dictionary caches while the entries are being modified or used. They guarantee that statements being parsed do not see inconsistent object definitions.
- File and Log Management Locks
- Protect various files like control files, redo log files so that only one process at a time can change it. Datafiles are locked to ensure that multiple instances mount a database in shared mode or that one instance mounts it in exclusive mode.
- Tablespace and Rollback Segment Locks
- Protect tablespaces and rollback segments. Example, all instances accessing a database must agree on if s tablespace is online or offline. Rollback segments are locked so that only one instance can write to a segment.
Data Dictionary Tables
DBA_LOCK_INTERNAL
1 row for every lock or latch held or being requested
DBA_LOCKS
All locks or latches held or being requested
DBA_DML_LOCKS
All DML locks held or being requested in DB
DBA_DDL_LOCKS
All DDL locks held or being requested in DB
DBA_BLOCKERS
Non-waiting sessions holding locks being waited on
DBA_WAITERS
All sessions waiting on, but not holding waited for locks