Sur le problème de table mutante dans les triggers

Sur le problème de table mutante dans les triggers

- SERRANO ALVARADO Patricia の投稿
返信数: 0

Bonjour,

Voici quelques explications sur le problème de table mutante.

Lors d’une requête (insert, update, delete, select) le SGBD génère des transactions qui peuvent être liées en quelque sorte. Avec les triggers, pendant l’exécution des requêtes, on déclenche des traitements PLSQL. L’erreur de table mutante survient lorsqu’on veut accéder de manière conflictuelle (écriture et lecture au même temps) sur la donnée concernée par le trigger (i.e., le tuple à insérer ou à modifier). 

Dans la question Q2 du TP3 (partie sur la mise à jour de la note moyenne), on aura un problème de table mutante. Là il est question d’un trigger AFTER INSERT sur la table Avis afin de mettre à jour l’avis global d’un livre (sur la table Livres) à chaque fois qu’on insère un avis. Le problème survient car on souhaite lire la table Avis (pour calculer la moyenne des notes) après une insertion qui n'a pas fini. Donc, la table Avis est en "mutation", car le nouvel avis est en train d’être inséré (même si c’est un trigger AFTER le SGBD a toujours le verrou sur le tuple qui est en train d'être inséré). 

Si vous faites un trigger BEFORE ca va marcher, il n’y aura pas de problème de table mutante (la lecture sera faite sur les données de la table Avis avant l'insertion). Comme vous n'avez pas la nouvelle note (car le tuple n'a pas encore été inséré) vous pouvez calculer la bonne moyenne en additionnant :new.note aux notes qui existent déjà et en divisant le tout par le nombre des notes +1 (i.e., vous calculez la note moyenne à la main). Ca va marcher, sauf que la cohérence de la BD ne sera pas assurée toujours. En effet, vous serez en train de mettre à jour Livres avant l’insertion sur Avis et il peut y avoir une erreur système entre le moment de la mise à jour de la table Livres et l’insertion sur Avis (i.e., l’insertion sur Avis ne se fera pas mais la mise à jour sur Livres oui).


Dans la question Q3 du TD sur les triggers, il est question d’un trigger BEFORE INSERT sur la table Reservs afin de vérifier que la nouvelle réservation plus les réservations déjà existantes ne dépassent pas la limite de la promotion en question. Dans ce cas, il n’y a pas de problème de table mutante. Les valeurs de la nouvelle insertion on peut les lire avec :new et les tuples existantes (avant l'insertion) avec une requête.

N'hésitez pas à poser de questions sur le forum ou à vos chargés de TP/TD.


Cordialement,

L'équipe enseignante