¿Cuáles son las causas y soluciones para los errores de la tabla de mutaciones?


12

Entiendo que los errores de la tabla de mutaciones son causados ​​por una falla de diseño o una consulta problemática.

Recientemente se puso en producción una consulta antigua que arroja un error de tabla mutante. Nuestro DBA resolvió el problema pero no sabemos cómo.

¿Qué causa exactamente los errores de la tabla de mutaciones y cómo nuestro DBA habría solucionado el problema?

Respuestas:


17

La causa más probable de un error en la tabla de mutaciones es el mal uso de los desencadenantes. Aquí está un ejemplo típico:

  1. inserta una fila en la tabla A
  2. un disparador en la tabla A (para cada fila) ejecuta una consulta en la tabla A, por ejemplo, para calcular una columna de resumen
  3. Oracle lanza un ORA-04091: la tabla A está mutando, es posible que el disparador / función no lo vea

Este es un comportamiento esperado y normal, Oracle quiere protegerlo de usted mismo ya que Oracle garantiza:

  • (i) que cada declaración es atómica (es decir, fallará o tendrá éxito por completo)
  • (ii) que cada declaración ve una vista consistente de los datos

Lo más probable es que cuando escriba este tipo de desencadenante espere que la consulta (2) vea la fila insertada en (1). Esto estaría en contradicción con los dos puntos anteriores ya que la actualización aún no ha finalizado (podría haber más filas para insertar).

Oracle podría devolver el resultado consistente con un punto en el tiempo justo antes del comienzo de la declaración, pero a partir de la mayoría de los ejemplos que he visto que intentan implementar esta lógica, las personas ven una declaración de varias filas como una serie de pasos sucesivos y esperan que declaración [2] para ver los cambios realizados por los pasos anteriores. Oracle no puede devolver el resultado esperado y, por lo tanto, arroja el error.

Para más información: "tabla de mutaciones" en Ask Tom .

Si sospecho que la causa del error de la tabla de mutaciones es un desencadenante, una forma de evitar el error es mover la lógica del desencadenante a los procedimientos.


9

Se produce una tabla de mutaciones cuando una instrucción hace que se active un desencadenador y ese desencadenante hace referencia a la tabla que causó el desencadenante. La mejor manera de evitar tales problemas es no usar disparadores, pero sospecho que el DBA no se tomó el tiempo para hacerlo. Podría haber hecho uno de los siguientes:


1
Al menos para mí, cambiar a ser un disparador posterior falla el 11.2.0.4.0
Software Prophets

Tambien para mi; versión 12.1.0.2.0, y DESPUÉS no funciona.
eidylon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.