Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I identify the rows involved in an Oracle deadlock?

When Oracle detects a deadlock, a trace file like this is written:

*** SESSION ID:(56.27081) 2012-05-14 08:16:28.013
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock: Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-0010002c-002719b5       146      56     X            164      44           X
TX-000f002a-002edd1e       164      44     X            146      56           X
session 56: DID 0001-0092-00050D0D       session 44: DID 0001-00A4-0002E3C2
session 44: DID 0001-00A4-0002E3C2       session 56: DID 0001-0092-00050D0D
Rows waited on:
Session 44: obj - rowid = 00035157 - AAA1FXAAxAAASfLAAn
  (dictionary objn - 217431, file - 49, block - 75723, slot - 39)
Session 56: obj - rowid = 00035157 - AAA1FXAAsAACjuiAAP
  (dictionary objn - 217431, file - 44, block - 670626, slot - 15)

How can I determine the rows involved based on the information above in order to assist in debugging the application?

like image 557
WW. Avatar asked May 14 '12 02:05

WW.


People also ask

How do you check if there is a deadlock in Oracle?

When Oracle detects a deadlock, the current SQL in the session detecting the deadlock is cancelled and 'statement-level rollback' is performed so as to free up resources and not block all activity. The session that detected the deadlock is still 'alive' and the rest of the transaction is still active.

How can we avoid deadlock in Oracle?

LOCK IN SHARE MODE ), try using a lower isolation level such as READ COMMITTED . When modifying multiple tables within a transaction, or different sets of rows in the same table, do those operations in a consistent order each time. Then transactions form well-defined queues and do not deadlock.


1 Answers

I found the answer:

  1. The number after dictionary objn can be used to select out of DBA_objects.

    SELECT owner, object_name, object_type 
    FROM dba_objects 
    WHERE object_id = 217431;
    
  2. Once the table is identified, the row can be found using the rowid:

    SELECT * 
    FROM table_found_above 
    WHERE rowid = 'AAA1FXAAxAAASfLAAn';
    

If the trace file says that there are no "Rows waited on" this technique will not work. The problem may be due to an unindexed foreign key.

like image 85
WW. Avatar answered Oct 04 '22 03:10

WW.