recurso ora mientras interbloqueo esperaba detected detectado database oracle unix plsql aix

database - detected - ORA-00060: se ha detectado un interbloqueo mientras se esperaba un recurso



deadlock detected (3)

Me encontré con este problema también. No sé los detalles técnicos de lo que realmente estaba sucediendo. Sin embargo, en mi situación , la causa raíz era que había una configuración de eliminaciones en cascada en la base de datos Oracle y mi código JPA / Hibernate también estaba tratando de hacer las llamadas de eliminación en cascada. Así que mi consejo es asegurarse de que sepa exactamente lo que está sucediendo.

Tengo una serie de scripts que se ejecutan en paralelo como nohup en un servidor AIX que aloja oracle 10g. Estos scripts están escritos por otra persona y están destinados a ejecutarse simultáneamente. Todos los scripts están realizando actualizaciones en una tabla. Estoy recibiendo el error,

ORA-00060: se ha detectado un interbloqueo mientras se esperaba un recurso

Mientras buscaba en Google para esto, encontré http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm

A pesar de que los scripts están realizando actualizaciones en la misma tabla al mismo tiempo, están realizando actualizaciones en diferentes registros de la tabla determinados por la cláusula WHERE sin superposiciones de registros entre ellos.

Entonces, ¿esto habría causado el error?

¿Ocurrirá este error independientemente de dónde se realicen las actualizaciones en una tabla?

¿Debo evitar las actualizaciones simultáneas en una tabla en todo momento?

Extrañamente también encontré en el registro nohup.out, PL/SQL successfully completed después del error citado anteriormente.

¿Esto significa que oracle se recuperó del punto muerto y completó las actualizaciones con éxito o debería volver a ejecutar esos scripts en serie? Cualquier ayuda sera bienvenida.

Gracias por adelantado.


Puede obtener puntos muertos en más que solo bloqueos de filas, por ejemplo, vea this . Los scripts pueden estar compitiendo por otros recursos, como los bloques de índice.

He solucionado esto en el pasado mediante la ingeniería del paralelismo de tal manera que diferentes instancias trabajan en partes de la carga de trabajo que tienen menos probabilidades de afectar los bloques que están cerca unos de otros; por ejemplo, para una actualización de una tabla grande, en lugar de configurar los esclavos paralelos utilizando algo como MOD(n,10) , usaría TRUNC(n/10) que significa que cada esclavo trabajó en un conjunto de datos contiguos .

Hay, por supuesto, formas mucho mejores de dividir un trabajo para el paralelismo, por ejemplo, DBMS_PARALLEL_EXECUTE .

¿No está seguro de por qué está obteniendo "PL / SQL completado con éxito", tal vez sus scripts están manejando la excepción?


Recientemente estuve luchando con un problema similar. Resultó que en la base de datos faltaban los índices de las claves externas. Eso causó que Oracle bloqueara muchos más registros de los necesarios, lo que rápidamente llevó a un punto muerto durante la alta concurrencia.

Aquí hay un excelente artículo con muchos detalles, sugerencias y detalles sobre cómo solucionar un punto muerto: http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk