3961: Snapshot isolation transaction failed because the object was modified by a DDL statement (échec de la transaction en snapshot isolation : objet modifié par une instruction DDL)
SQL ServerQue signifie cette erreur ?
Une transaction en snapshot isolation a échoué car un objet auquel elle accédait a été modifié par une instruction DDL (changement de schéma) dans une autre transaction concurrente. Les métadonnées ne sont pas versionnées, la transaction snapshot ne peut donc pas continuer.
Cause
Pendant qu'une transaction démarrée en isolation SNAPSHOT (SET TRANSACTION ISOLATION LEVEL SNAPSHOT) s'exécute, une autre session lance du DDL comme ALTER TABLE/CREATE INDEX sur une table à laquelle elle accède. Les transactions snapshot voient les versions de lignes mais pas les versions du schéma. Cette erreur ne se produit pas sous READ COMMITTED SNAPSHOT (RCSI) ; RCSI prend un nouveau snapshot à chaque instruction.
Comment la corriger
Relancez la transaction ; elle réussit généralement une fois le DDL terminé. Comme correctif durable, effectuez les changements de schéma (DDL) pendant des fenêtres de maintenance sans charge snapshot importante. Interceptez cette erreur dans l'application et implémentez une logique de relance automatique. Raccourcissez les transactions snapshot de longue durée.
Autres entrées pour ce moteur
- 3902The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION (COMMIT TRANSACTION sans BEGIN TRANSACTION correspondant)
- 1101Could not allocate a new page because of insufficient disk space in filegroup (impossible d'allouer une nouvelle page : espace disque insuffisant dans le filegroup)
- 3729Cannot DROP because it is being referenced by object (DROP impossible : l'objet est référencé par un autre objet)
- 1785Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (la contrainte FOREIGN KEY peut créer des cycles ou plusieurs chemins de cascade)
- 9421XML parsing: illegal xml character (analyse XML : caractère XML illégal)
- 15151Cannot find the object/principal because it does not exist or you do not have permission (objet/principal introuvable : inexistant ou droits insuffisants)
- 4834You do not have permission to use the bulk load statement (vous n'avez pas le droit d'utiliser l'instruction de chargement en masse)