正确使用SQL Server 2008中的事务
我有2个命令,需要他们都正确执行或没有执行。 所以我想我需要一个交易,但我不知道如何正确使用它。
以下脚本有什么问题?
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
insert
命令执行但update
命令有问题。 我怎样才能实现这个回滚两个命令,如果他们有任何执行错误?
添加try / catch块,如果事务成功,它将提交更改,如果事务失败,事务将被回滚:
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
在存储过程的开始,应该把SET XACT_ABORT ON指示Sql Server在错误的情况下自动回滚事务。 如果忽略或设置为OFF,则需要在每个语句后testing@@ ERROR或使用TRY … CATCH回滚块。
简单的方法:
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;