Question: What is the deadly embrace, or the perpetual
embrace? Does Oracle prevent the deadly embrace, and if so, what errors do I see and how can I prevent them?
Answer:
The deadly embrace often manifests itself as
ORA-04020 deadlock detected error.
This is how a deadly embrace happens in Oracle:
1
- Assume that SQL 1 is "holding rows" (via the
select for
update clause) and is waiting to get more rows that are held by SQL 2.
2 - SQL 2 attempts to update rows that are being held by SQL 1.
3 -
Oracle aborts SQL 2 and issues one of these deadlock messages:
Also see these notes on
ORA-00054 error,
resource busy and NOWAIT specified.
Here are several Oracle deadlock error messages:
ORA-00060: deadlock detected while
waiting for resource
Cause:
Transactions deadlocked one another while waiting for resources.
Action: Look at the trace file to
see the transactions and resources involved. Retry if necessary.
ORA-04020
deadlock detected while trying to lock object
Cause: While trying to lock a library object, a
deadlock is detected.
Action: Retry the operation later.
As we see the perpetual embrace happens when another DML are waiting on resources that are
requested by the other, we have the condition knows as the "deadly embrace",
and Oracle terminates the DML that causes the embrace. This perpetual
embrace occurs when a session is locking rows using the "for update"
clause", which is not a good practice.
Whenever you have competing
DML running against the same data, you run the risk of a deadlock. This
deadlock condition is an age-old issue known as the "perpetual embrace"!
If your ORA-00060 is caused by competing resources, the perpetual
embrace happens when the aborted task (Task B) attempts to lock a row which
is being held by another task (Task A), which, in-turn, is waiting for task
B to release a lock. To prevent a perpetual wait, Oracle aborts the
transaction that caused the deadlock.
The select for update is not a
good locking
strategy because there are many things that can go wrong. Instead
of select for update, savvy Oracle developers will adopt
alternatives mechanisms like a re-read upon update commit where the
transaction re-read the rows and ensure that it has not changed since the
original read.
 |
If
you like Oracle tuning, you may enjoy my bestselling book
Oracle Tuning: The Definitive Reference",
with over 900 pages of BC's favorite tuning tips & scripts.
You can buy it direct from the publisher for 30%-off and get
instant access to the code depot of Oracle tuning scripts. |