3961: Snapshot isolation transaction failed because the object was modified by a DDL statement (falló la transacción snapshot porque una sentencia DDL modificó el objeto)
SQL Server¿Qué significa?
Una transacción con aislamiento snapshot falló porque un objeto al que accedía fue modificado por una sentencia DDL (cambio de esquema) en otra transacción concurrente. Los metadatos no tienen versiones, por lo que la transacción snapshot no puede continuar.
¿Por qué ocurre?
Mientras se ejecuta una transacción iniciada con aislamiento SNAPSHOT (SET TRANSACTION ISOLATION LEVEL SNAPSHOT), otra sesión ejecuta DDL como ALTER TABLE/CREATE INDEX sobre una tabla a la que accede. Las transacciones snapshot pueden ver versiones de filas, pero no versiones del esquema. Este error no se produce con READ COMMITTED SNAPSHOT (RCSI); RCSI toma un nuevo snapshot para cada sentencia.
Cómo solucionarlo
Reintente la transacción; normalmente funciona una vez completado el DDL. Como solución permanente, realice los cambios de esquema (DDL) en ventanas de mantenimiento sin carga snapshot intensa. Capture este error en la aplicación e implemente una lógica de reintento automático. Acorte las transacciones snapshot de larga duración.
Más entradas de este motor
- 3902The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION (COMMIT TRANSACTION sin BEGIN TRANSACTION correspondiente)
- 1101Could not allocate a new page because of insufficient disk space in filegroup (no se pudo asignar una nueva página por falta de espacio en disco en el filegroup)
- 3729Cannot DROP because it is being referenced by object (no se puede eliminar porque otro objeto lo referencia)
- 1785Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (la restricción FOREIGN KEY puede provocar ciclos o varias rutas de cascada)
- 9421XML parsing: illegal xml character
- 15151Cannot find the object/principal because it does not exist or you do not have permission (no se encuentra el objeto/principal porque no existe o no tiene permiso)
- 4834You do not have permission to use the bulk load statement (no tiene permiso para usar la sentencia de carga masiva)