sql >> Base de Datos >  >> RDS >> Oracle

Encontrar la causa del error de interbloqueo del archivo de seguimiento de Oracle

En primer lugar, select La declaración nunca bloquea nada en Oracle, solo usa la última versión consistente disponible de los datos. No es un caso para select ... for update que bloquea datos como update desde Oracle 9i, pero no hay for update cláusula en la consulta de la pregunta.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

La sesión n.º 72 tiene un bloqueo de nivel de tabla (TM) con el tipo "Row Exclusive" (SX) y desea adquirir el bloqueo "Share Row Exclusive" (SSX) en la misma tabla. Esta sesión está bloqueada por la sesión n.º 24, que ya tiene un bloqueo a nivel de tabla del mismo tipo (SX) y espera mientras el bloqueo SSX esté disponible.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Esta (segunda fila) demuestra exactamente la misma situación, pero en la dirección opuesta:la sesión n.º 24 espera que el bloqueo SSX esté disponible, pero la sesión n.º 72 la bloquea, ya que tiene el bloqueo SX en la misma tabla.

Entonces, las sesiones n.º 24 y n.º 72 se bloquean entre sí:se produce un interbloqueo.

Ambos tipos de bloqueo (SX y SSX) son bloqueos de nivel de tabla.
Para comprender la situación, recomiendo leer este artículo de Franck Pachot.

A continuación se muestra una cita de este artículo, que es directamente relevante para su situación (tenga en cuenta que las abreviaturas SSX y SRX son equivalentes):

La integridad referencial también adquiere bloqueos TM. Por ejemplo, el problema común con las claves foráneas sin indexar conduce a bloqueos S en la tabla secundaria cuando emite una eliminación o actualización de la clave en la tabla principal. Esto se debe a que sin un índice, Oracle no tiene un solo recurso de nivel inferior que bloquear para evitar una inserción concurrente que pueda violar la integridad referencial.
Cuando las columnas de clave externa son las columnas principales en un índice regular, entonces la primera entrada de índice con el valor principal puede usarse como un único recurso y bloquearse con un TXlock de nivel de fila.
¿Y qué pasa si la integridad referencial tiene una cascada de eliminación? Además del modo S, existe la intención de actualizar filas en la tabla secundaria, como con el modo Fila X (RX). Aquí es donde se produce la fila compartida exclusiva (SRX):S+RX=SRX.

Entonces, la variante más probable es que la Sesión #72 y la Sesión #24 eliminen algunas filas en EMPLOYEE tabla al mismo tiempo, y hay on delete cascade restricción para EMPSAL_EMP_ID junto con la ausencia de índice en EMPLOYEE_SALARY tabla en la que EMPSAL_EMP_ID columna listada primero.