2012-05-14 13 views
6

Cuando Oracle detecta un punto muerto, un archivo de rastreo como esto está escrito:¿Cómo puedo identificar las filas involucradas en un punto muerto de 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) 

¿Cómo puedo determinar las filas involucradas en base a la información anterior con el fin de ayudar en la depuración de la aplicación?

Respuesta

12

he encontrado la respuesta:

  1. El número después de dictionary objn se puede utilizar para seleccionar de DBA_OBJECTS.

    SELECT owner, object_name, object_type 
    FROM dba_objects 
    WHERE object_id = 217431; 
    
  2. vez que se identifica la tabla, la fila se puede encontrar utilizando el ID de fila:

    SELECT * 
    FROM table_found_above 
    WHERE rowid = 'AAA1FXAAxAAASfLAAn'; 
    

Si el archivo de seguimiento dice que no hay "Filas esperaron en" esta técnica se no trabajo. El problema puede deberse a una clave externa no indexada.

Cuestiones relacionadas