Understanding Oracle Locking
Locks:
Are used to protect data (blocks, segments, rows …)
Several users can share locks
Lock requests are queued up using mechanism called as
enqueue. Enqueues are lists/queues stored in Shared
Pool
A transaction ID of a transaction that locks a table or
a row is stored in the header of that table or row.
Latches:
Used to protect memory structure (SGA)
Latches cannot be shared by processes
Latch request are not queued up. (immediate or willing
to wait (spins))
Locks provide data concurrency and consistency
Data concurrency means that many users can access data
at the same time.
Data consistency means that each user sees a consistent
view of the data, including visible changes made by the
user's own transactions and transactions of other
users.
How does Oracle
provide data
consistency (UNDO
segments)
Isolation levels
Isolation levels are
how Oracle executed
SQL statements in
regards to read
consistency.
Isolation levels are
directly related to
the type of locks that are acquired or ignored.
Read committed - read records that are committed by
other users, uncommitted records by other user are
ignored – this is the default isolation level for
Oracle)
Serilizable – database is frozen (do not read
transactions committed by other users after I have
started my serializable transaction. User behaves as if
he/she is the only user in the database. In PL/SQL
“select .. for update” is a serializable transaction)
Any changes that I make to data in my serializable
transaction can be seen by me.
How to set the isolation level
Alter session set isolation_level=serializable;
Once a lock is obtained, it is released only when user
commits or rolls back the transaction. This means a
lock is obtained for the duration of a transaction and
not for the duration of the query.
Types of Locks
DML Lock / Data Locks
DDL Lock / Dictionary Lock
Lock Modes
o Exclusive (X) (other users cannot modify the
resource. They can read)
o Share (S) (other users can obtain share locks)
Data lock Level
o Table (T)
RS – Row Share
RX – Row Exclusive
S – Share
SRX - Share Row Exclusive
X - Exclusive
o Row (R)
Locked or not locked – always exclusive
Lock Types
Explicit
Implicit
DML Locks (Table locks)
Insert, Row Other users can still perform Implicit
update, Exclusive DML on any other row in the
delete (RX) table.
Select … Row Share Other users can still perform Implicit
for update (RS) DML on the rows in the table
that were not returned by the
SELECT
statement.
UPDATE and Share Row Users can still perform DML Implicit
DELETE Exclusive on any other row in either
on parent (SRX) – like the parent or child table as
tables an Exclusive long as an index
with lock which exists on the child table’s
Foreign allows RS Foreign Key column.* (Lock is
Key lock for not acquired in 9i Release 2
relationsh other users and above)
ips to
child
tables
LOCK TABLE Exclusive(X) Other users can only query Explicit
... IN the table until the locking
EXCLUSIVE transaction
MODE is either committed or rolled
back.
DDL Locks (Table Locks)
Create, Exclusive(X) Prevents other users from Implicit
drop, issuing DML or
alter SELECT statements against the
referenced
table until after the CREATE,
DROP, or ALTER
operation is complete
Create Shared(S) During the compilation of a Implicit
procedure, procedure/function, user
Audit acquires (S) locks on tables
that are referenced in the
code. It, therefore, prevents
other users from altering or
dropping this table until the
procedure is compiled. This
lock allows other user to
compile their
procsdures/functions
How to Monitor Locking/blocking activity
V$locks
SELECT s.username,
DECODE(l.type,’TM’,’TABLE LOCK’, ‘TX’,’ROW LOCK’,
NULL) “LOCK LEVEL”,
o.owner, o.object_name, o.object_type
FROM v$session s, v$lock l, dba_objects o
WHERE s.sid = l.sid
AND o.object_id = l.id1
AND s.username IS NOT NULL;
V$locked_object (also gives blocking info)
SELECT LPAD(‘ ‘,DECODE(l.xidusn,0,3,0))
||l.oracle_username “User Name”,
o.owner, o.object_name, o.object_type
FROM v$locked_object l, dba_objects o
WHERE l.object_id = o.object_id
ORDER by o.object_id, 1 desc;
V$DBA_WAITERS
DBA_BLOCKERS
SELECT s.username
FROM dba_blockers db, v$session s
WHERE db.holding_session = s.sid;
Use /rdbms/admin/utllockt.sql instead of above queries
Enqueue Statistics
Enqueues are shared memory structures that serialize access
to database resources(tables, indexes etc.).
select *
from v$sgastat
where name like ‘%enqueue%’
Enqueue wait
Enqueue requests
Enqueue conversions (e.g. upgrading locks)
Enqueue timeouts
Enqueue deadlocks
Initialization Parameters
DML_LOCKS = Maximum number of DML locks for the
entire instance (A DML lock is a lock obtained on
a table that is undergoing a DML operation
(insert, update, delete).) = 4 *
TRANSACRIONS(derived from TRANSACTIONS which is
derived from SESSIONS)
ENQUEUE_RESOURCES sets the number of resources
that can be concurrently locked by the lock
manager. It is derived from SESSIONS, which is
derived from PROCESSES
TRANSACTIONS = 1.1 * SESSIONS (to allow recursive
transactions)
SESSIONS = 1.1 * PROCESSES + 5
PROCESSES=100 We should set parameter based on
concurrent number of users.
Set these parameters when you get an error message that
enqueues are exhausted
How to tune locking
Change the application code so less-restrictive locking
is used
Do not use lock tables in exclusive more in your code
Avoid coding long transactions
Contact the blocking user and ask them to commit or
roll back their changes – else kill their sessions.
When the session is killed, the transaction of that
session is rolled back.
Remember – deadlocks are automatically resolved by
Oracle by rolling back the one of the transactions.
How to kill a blocking session.
SELECT s.username, s.sid, s.serial#
FROM dba_blockers db, v$session s
WHERE db.holding_session = s.sid;
Alter system kill session ‘SID,Serial#’
ORA-00028 “Your session has been killed”