2008-11-14 13 views
11

Si simplemente envolver mi consulta con:Plantilla básica para transacciones en SQL Server

BEGIN TRANSACTION 



COMMIT TRANSACTION 

Si algo falla en el interior de eso, va a deshacer de forma automática?

De mirar otro código, que parecen para comprobar si hay un error, si hay un error entonces hacer una declaración GOTO que a su vez llama a ROLLBACK TRANSACTION

Pero eso parece que adjudicar de trabajo, a tener que comprobar para IF (@@ ERROR <> 0) después de cada inserción/actualización.

Respuesta

4

sí, es importante revertir explícitamente la transacción en caso de que no funcione.

Normalmente le digo a mi hijo que solo tiene que cepillarse los dientes que desea conservar.

En este caso, solo necesita deshacer los comandos que no desea ejecutar.

2

Esto deshacer la transacción de forma automática en caso de error

SET XACT_ABORT ON 

BEGIN TRANSACTION 
-- CODE HERE 
COMMIT TRANSACTION 
1

Para el control de transacción se utiliza begin, commit y rollback. Comienza una transacción suministrando BEGIN TRANSACTION. A continuación, coloca las diversas instrucciones SQL que necesita. Luego finaliza la transacción emitiendo una confirmación o una reversión. COMMIT TRANSACTION comprometerá todos los cambios que realizó en la base de datos después de la declaración BEGIN y los convertirá en permanentes, por así decirlo. ROLLBACK TRANSACTION revertirá todos los cambios que haya realizado en la base de datos después de la instrucción BEGIN. Sin embargo, no cambiará los valores de las variables.

Ejemplo:

BEGIN TRANSACTION 

UPDATE table SET column = 'ABC' WHERE column = '123' 

COMMIT TRANSACTION 

--//column now has a value of 'ABC' 

BEGIN TRANSACTION 

UPDATE table SET column = 'ABC' WHERE column = '123' 

ROLLBACK TRANSACTION 

--//column still has it's previous value ('123') No changes were made. 
+0

Esto realmente no responde a la pregunta ... –

25

Me suelen hacer algo como esto dentro de mis procedimientos almacenados. Mantiene las cosas buenas y seguras, y transmite cualquier error que encuentre.

SET XACT_ABORT ON; 

BEGIN TRY 
    BEGIN TRANSACTION; 

    -- Code goes here 

    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 

    DECLARE 
     @ERROR_SEVERITY INT, 
     @ERROR_STATE INT, 
     @ERROR_NUMBER INT, 
     @ERROR_LINE  INT, 
     @ERROR_MESSAGE NVARCHAR(4000); 

    SELECT 
     @ERROR_SEVERITY = ERROR_SEVERITY(), 
     @ERROR_STATE = ERROR_STATE(), 
     @ERROR_NUMBER = ERROR_NUMBER(), 
     @ERROR_LINE  = ERROR_LINE(), 
     @ERROR_MESSAGE = ERROR_MESSAGE(); 

    RAISERROR('Msg %d, Line %d, :%s', 
     @ERROR_SEVERITY, 
     @ERROR_STATE, 
     @ERROR_NUMBER, 
     @ERROR_LINE, 
     @ERROR_MESSAGE); 
END CATCH 
+0

Me gusta mucho esta solución. ¿Algún comentario sobre desventajas/defectos ...? – Mauro

+0

La única desventaja que he encontrado es decidir cuál es la mejor respuesta a los errores planteados en la transacción. Este código revertirá todas las transacciones abiertas/pendientes (si está utilizando transacciones anidadas), por lo que puede causar que ocurran cosas extrañas en el código de llamada. La capa de acceso a datos espera poder revertir una transacción. –

+0

¿Qué hay de usar XACT_STATE en lugar de @@ TRANCOUNT para determinar si revertir o no? – kman

Cuestiones relacionadas