La cause la plus probable d'une erreur de table en mutation est l'utilisation abusive des déclencheurs. Voici un exemple typique:
- vous insérez une ligne dans le tableau A
- 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
- 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.
Vincent Malgrat
la source