Tenemos una aplicación cliente que ejecuta algunos SQL en un SQL Server 2005 como el siguiente:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Se envía mediante un comando de cadena larga.
Si falla una de las inserciones, o falla alguna parte del comando, ¿SQL Server revierte la transacción? Si no se revierte, ¿tengo que enviar un segundo comando para revertirlo?
Puedo dar detalles sobre la API y el idioma que estoy usando, pero creo que SQL Server debería responder igual para cualquier idioma.
sql
sql-server
sql-server-2005
transactions
jonathanpeppers
fuente
fuente
Respuestas:
Puede colocar
set xact_abort on
antes de su transacción para asegurarse de que sql retrocede automáticamente en caso de error.fuente
xact_abort
está en el nivel de conexión.Tiene razón en que toda la transacción se revertirá. Debe emitir el comando para revertirlo.
Puede envolver esto en un
TRY CATCH
bloque de la siguiente manerafuente
try
), pero el código falla después. No hay más transacciones, pero aún estás entrando en elcatch
.Aquí el código con el mensaje de error que funciona con MSSQL Server 2016:
fuente
DECLARE @Var TYPE; SET @Var = ERROR;
para generar errores en el servidor SQL 2005. De lo contrario, el código anterior para generar errores también funciona para los DB más antiguos. Intentar asignar un valor predeterminado a una variable local es lo que estaba causando el problema.Del artículo de MDSN, Control de transacciones (motor de base de datos) .
En su caso, revertirá la transacción completa cuando falle cualquiera de las inserciones.
fuente
No, no lo hace.
Claro, deberías emitir en
ROLLBACK
lugar deCOMMIT
.Si desea decidir si compromete o revierte la transacción, debe eliminar la
COMMIT
oración de la declaración, verificar los resultados de las inserciones y luego emitirCOMMIT
oROLLBACK
dependiendo de los resultados de la verificación.fuente
Named Pipes
OTCP
) interrumpe la conexión. Cuando se interrumpe una conexión,SQL Server
detiene todos los comandos que se ejecutan actualmente y revierte la transacción.