Pregunta

Entiendo que la mutación de errores de la tabla son causadas por un defecto de diseño o de la consulta problemática.

Una consulta de edad fue puesto recientemente en producción que arroja un error de tabla mutante. Nuestro DBA resolvió el problema, pero no sabemos cómo.

¿Qué causa exactamente la mutación de errores de la tabla y cómo sería nuestra DBA haber solucionado el problema?

¿Fue útil?

Solución

La causa más probable de un error de tabla mutante es el mal uso de los disparadores. Aquí es un ejemplo típico:

  1. se inserta una fila en la tabla A
  2. un disparador en la tabla A (para cada fila) realiza 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, disparador / función no puede verlo

Este es un comportamiento esperado y normal, Oracle quiere protegerse de sí mismo ya que Oracle garantiza:

  • (i) que cada declaración es atómica (es decir, o bien fracasar o tener éxito completo)
  • (ii) que cada declaración ve una visión consistente de los datos

Lo más probable cuando se escribe este tipo de gatillo que se puede esperar la consulta (2) para ver la fila insertada en (1). Esto estaría en contradicción con los dos puntos anteriores ya que la actualización no ha terminado todavía (que podría haber más filas para ser insertados).

Oracle podría devolver el resultado consistente con un punto en el tiempo justo antes de el principio de la instrucción, sino de la mayoría de los ejemplos que he visto que tratar de aplicar esta lógica , la gente ve una declaración de varias filas como una serie de pasos sucesivos y esperan la declaración [2] para ver los cambios realizados por los pasos anteriores. Oracle no puede devolver el resultado esperado y, por tanto, arroja el error.

Para la lectura adicional: "tabla mutante "en la Pregunta a Tom .

Si, como sospecho que la causa del error tabla mutante es un disparador, una forma de evitar el error es mover la lógica del gatillo en los procedimientos.

Otros consejos

mutando mesa ocurre cuando una instrucción provoca una gatillo para disparar y que se disparan referencia a la tabla que causó el gatillo. La mejor manera de evitar este tipo de problemas es no utilizar disparadores, pero sospecho que el DBA no se tomó el tiempo para hacer eso. Podía tener uno hecho de la siguiente:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top