web-dev-qa-db-fra.com

Quelles sont les causes et les solutions pour la mutation des erreurs de table?

Je comprends que les erreurs de table en mutation sont causées par un défaut de conception ou une requête problématique.

Une ancienne requête a récemment été mise en production, ce qui génère une erreur de table en mutation. Notre DBA a résolu le problème mais nous ne savons pas comment.

Qu'est-ce qui cause exactement les erreurs de table de mutation et comment notre DBA aurait-il résolu le problème?

12
parmanand

La cause la plus probable d'une erreur de table en mutation est l'utilisation abusive des déclencheurs. Voici un exemple typique:

  1. vous insérez une ligne dans le tableau A
  2. un déclencheur sur la table A (pour chaque ligne) exécute une requête sur la table A, par exemple pour calculer une colonne récapitulative
  3. Oracle lance un ORA-04091: la table A est en train de muter, le déclencheur/la fonction peut ne pas le voir

Il s'agit d'un comportement normal et attendu, Oracle veut vous protéger de vous-même car Oracle garantit:

  • (i) que chaque déclaration est atomique (c'est-à-dire qu'elle échouera ou réussira complètement)
  • (ii) que chaque déclaration présente une vue cohérente des données

Très probablement, lorsque vous écrivez ce type de déclencheur, vous vous attendez à ce que la requête (2) voit la ligne insérée sur (1). Cela serait en contradiction avec les deux points ci-dessus car la mise à jour n'est pas encore terminée (il pourrait y avoir plus de lignes à insérer).

Oracle pourrait retourner le résultat cohérent avec un point dans le temps juste avant le au début de l'instruction, mais à partir de la plupart des exemples que j'ai vus qui tentent d'implémenter cette logique, les gens voient une instruction à plusieurs lignes comme une série d'étapes successives et s'attendent à ce que l'instruction [2] voie les modifications apportées par les étapes précédentes. Oracle ne peut pas retourner le résultat attendu et renvoie donc l'erreur.

Pour en savoir plus: "table mutante" sur Ask Tom .

Si, comme je le soupçonne, la cause de l'erreur de la table de mutation est un déclencheur, une façon d'éviter l'erreur consiste à déplacer la logique du déclencheur dans les procédures.

17
Vincent Malgrat

Un table en mutation se produit lorsqu'une instruction provoque le déclenchement d'un déclencheur et que ce déclencheur fait référence à la table qui a provoqué le déclencheur. La meilleure façon d'éviter de tels problèmes est de ne pas utiliser de déclencheurs, mais je pense que le DBA n'a pas pris le temps de le faire. Il aurait pu faire l'une des choses suivantes:

9
Leigh Riffel