try transaction transacciones trancount stored sirve que para ejemplos catch begin sql database sql-server-2008 tsql transactions

transaction - try catch sql server



Uso correcto de las transacciones en SQL Server 2008 (3)

Agregue un bloque try / catch; si la transacción tiene éxito, confirmará los cambios; si la transacción falla, la transacción se revierte:

BEGIN TRANSACTION [Tran1] BEGIN TRY INSERT INTO [Test].[dbo].[T1] ([Title], [AVG]) VALUES (''Tidd130'', 130), (''Tidd230'', 230) UPDATE [Test].[dbo].[T1] SET [Title] = N''az2'' ,[AVG] = 1 WHERE [dbo].[T1].[Title] = N''az'' COMMIT TRANSACTION [Tran1] END TRY BEGIN CATCH ROLLBACK TRANSACTION [Tran1] END CATCH GO

Tengo 2 comandos y necesito ambos ejecutados correctamente o ninguno de ellos se ejecuta. Entonces, creo que necesito una Transacción, pero no sé cómo usarla correctamente.

¿Cuál es el problema con el siguiente script?

BEGIN TRANSACTION [Tran1] INSERT INTO [Test].[dbo].[T1] ([Title], [AVG]) VALUES (''Tidd130'', 130), (''Tidd230'', 230) UPDATE [Test].[dbo].[T1] SET [Title] = N''az2'' ,[AVG] = 1 WHERE [dbo].[T1].[Title] = N''az'' COMMIT TRANSACTION [Tran1] GO

El comando de insert ejecutó pero el comando de update tiene un problema. ¿Cómo puedo implementar esto para deshacer ambos comandos si alguno de ellos tiene un error en la ejecución?


Al comienzo del procedimiento almacenado, se debe poner SET XACT_ABORT en ON para indicar al servidor SQL que replique automáticamente la transacción en caso de error. Si se omite o se establece en OFF, se necesita probar @@ERROR después de cada declaración o usar TRY ... CATCH rollback block.


Enfoque fácil:

CREATE TABLE T ( C [nvarchar](100) NOT NULL UNIQUE, ); SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error. SELECT * FROM T; -- Check before. BEGIN TRAN INSERT INTO T VALUES (''A''); INSERT INTO T VALUES (''B''); INSERT INTO T VALUES (''B''); INSERT INTO T VALUES (''C''); COMMIT TRAN SELECT * FROM T; -- Check after. DELETE T;