sql-server - que - sql server define
Plantilla básica para transacciones en sqlserver (4)
Esto revertirá automáticamente la transacción en caso de error
SET XACT_ABORT ON
BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
Si simplemente envuelvo mi consulta con:
BEGIN TRANSACTION
COMMIT TRANSACTION
Si algo falla dentro de eso, ¿se revertirá automáticamente?
Al mirar otro código, parecen verificar si hay un error, si hay un error, entonces hacen una instrucción GOTO que luego llama a ROLLBACK TRANSACTION
Pero parece mucho trabajo, tener que verificar si IF (@@ ERROR <> 0) después de cada inserción / actualización.
Normalmente hago 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
Para el control de transacciones, usa comenzar, confirmar y deshacer. 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.
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.