2012-05-14 18 views
6

Quando Oracle rileva una situazione di stallo, un file di traccia come questo è scritto:Come posso identificare le righe coinvolte in un deadlock Oracle?

*** 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) 

Come è possibile determinare le righe coinvolte sulla base delle informazioni di cui sopra, al fine di facilitare il debug dell'applicazione?

risposta

12

ho trovato la risposta:

  1. Il numero dopo dictionary objn può essere utilizzato per selezionare fuori DBA_objects.

    SELECT owner, object_name, object_type 
    FROM dba_objects 
    WHERE object_id = 217431; 
    
  2. Una volta che la tabella è identificato, la riga può essere trovato utilizzando l'identificativo:

    SELECT * 
    FROM table_found_above 
    WHERE rowid = 'AAA1FXAAxAAASfLAAn'; 
    

Se il file di traccia dice che non ci sono "Righe aspettato su" Questa tecnica non funziona. Il problema potrebbe essere dovuto a una chiave esterna non indicizzata.

Problemi correlati