Español

Error: ORA-00060: deadlock detected while waiting for resource

Mensaje de error

Los interbloqueos de Oracle se producen cuando una o varias sesiones intentan adquirir un recurso de una base de datos que está siendo retenido por una segunda sesión que también está intentando adquirir un recurso retenido por la primera sesión.

Para eliminar el interbloqueo, Oracle libera el recurso retenido por una sesión y genera un error para permitir que la otra sesión continúe. Al hacerlo, se crea un archivo de rastreo para la sesión que ha generado el conflicto en un directorio basado en el valor del parámetro de inicialización user_dump_dest.

Mientras se comprime una geodatabase versionada, el comando de compresión puede encontrar el error de Oracle "ORA-00060: deadlock detected while waiting for resource".

Causa

Si se produce este error de Oracle durante una compresión, el interbloqueo detectado no es el tipo habitual de interbloqueo en el que dos sesiones están compitiendo y bloqueando solicitudes para que se actualicen o se eliminen los mismos objetos de una fila, sino un bloqueo de las ranuras ITL en el encabezado de bloque de un segmento.

Para obtener una descripción detallada del problema, revise el artículo de Oracle Metalink 62354.1 "TX Transaction locks - Example wait scenarios" under the section, "Waits due to Insufficient 'ITL' slots in a Block".

La condición de bloqueo detectada está probablemente en la tabla state_lineages o en uno de sus dos índices: lineages_pk o lineage__id_idx2.

Normalmente, el error solo aparece cuando se ejecuta una compresión mientras un alto número de usuarios edita simultáneamente la geodatabase versionada.

Solución o solución alternativa

Para resolver el error de interbloqueo, el usuario SDE debe volver a crear la tabla state_lineage o los índices e incrementar el valor del número de ranuras de transacción iniciales en el encabezado de bloque del objeto.

De manera predeterminada, ArcGIS define el valor initrans en 4 al crear todas las tablas y los índices empleados por el control de versiones. El valor initrans está controlado por el archivo dbtune.sde incluido en la palabra clave DATA_DICTIONARY, pero solo se hace referencia a él al crear inicialmente la instancia.

Para incrementar el valor de initrans para los índices, el usuario SDE regenera el índice y especifica el nuevo valor.

Código:
SQL> ALTER INDEX lineages_pk REBUILD INITRANS 8;

Índice alterado.

SQL> ALTER INDEX lineages_id_idx2 REBUILD INITRANS 8;

Índice alterado.


Para incrementar el tamaño en la tabla state_lineages, modifique la tabla.

Código:
SQL> ALTER TABLE state_lineages INITRANS 8;

Tabla modificada.


La limitación con la tabla es que la alteración no debe cambiar los bloques de datos existentes, sino solo los nuevos bloques agregados a medida que crece la tabla. Si el interbloqueo se produce en la tabla y al modificarla no se resuelve el problema, la propia tabla tendrá que ser exportada, eliminada y creada de nuevo. También será necesario definir un valor de initrans más alto y reimportar las filas en la nueva tabla.

Un valor de initrans igual a 8 o más será suficiente en la mayoría de los casos, pero para las organizaciones grandes con muchos editores simultáneos un valor igual a 8 podría no bastar. Oracle DBA debe monitorizar la instancia y buscar la frecuencia de las condiciones de bloqueo mientras se espera a las ranuras de ITL. Si es un evento de espera común, el valor se debe incrementar aún más. Para obtener instrucciones sobre el modo de monitorizar las condiciones de bloqueo, consulte la documentación de Oracle.

    Información relacionada