Sur le problème de table mutante

Sur le problème de table mutante

by SERRANO ALVARADO Patricia -
Number of replies: 0
Bonjour,

Suite à vos questions en TD, voici quelques explications sur le problème de table mutante.

Lors d’une requête sql (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) sur la donnée concernée par le trigger (ie le tuple à insérer ou à modifier).

Dans la question Q3 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. La nouvelle insertion on peut la lire avec :new et les tuples existantes avec une requête. J’ai vérifié, ca marche.

Par contre, dans la question Q2 du TP3 (partie Mise a? jour de la note moyenne), on aura un problème de table mutante, car 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 qu’on a c’est qu’on lit la table Avis après une insertion sur une table, qui 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 faite un trigger BEFORE ca va marcher, il n’y aura pas de problème de table mutante. Par contre, lorsque la requête qui lit Avis sera faite, la nouvelle ligne n’apparaitra pas dans le résultat (car cette fois on est sur un trigger BEFORE INSERT). Si vous calculez la bonne moyenne en utilisant :new.note plus les notes qui existent déjà et en divisant le tout par le nombre des notes +1 (ie., calcule de la 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 de l’avis (l’insertion ne se fera pas mais la mise à jour oui).

J’espère que vous avez compris, sinon, on en discute lundi en cours.

Cordialement