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


12

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?

Réponses:


17

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 attendu et normal, Oracle veut vous protéger de vous-même car Oracle garantit:

  • (i) que chaque instruction 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 renvoyer le résultat cohérent avec un point dans le temps juste avant le début de l'instruction, mais d'après 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 [2] pour voir 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 de mutation" 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.


9

Une 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 à l'origine du 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:


1
Au moins pour moi, le changement pour devenir un déclencheur après échoue le 11.2.0.4.0
Software Prophets

De même pour moi; version 12.1.0.2.0 et AFTER ne fonctionne pas.
eidylon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.