SQL Server - 正确的事务语法

时间:2017-10-25 08:23:08

标签: sql-server

我正在尝试为多个插入创建一个事务,如果一个失败,我希望所有插入都回滚。根据实例,我发现我有这个

BEGIN TRY
BEGIN TRAN
INSERT1
INSERT2
INSERT3
INSERT4
COMMIT TRAN
END TRY
BEGIN CATCH
 IF (@@TRANCOUNT > 0)  
BEGIN  
    ROLLBACK TRANSACTION;  
END; 
INSERT INTO Errors (errornumber, errorseverity, errorstate, errorprocedure, errorline, errormessage)
    VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE())
END CATCH

在我的示例中,INSERT4失败。其他插入似乎正确回滚但我收到此错误

EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 0,当前计数= 1。

语法是否正确?我见过其他测试IF的例子(XACT_STATE())= -1而不是@@ TRANCOUNT> 0

1 个答案:

答案 0 :(得分:-1)

这里将回滚所有插入语句,即使只有一个语句失败。

正如您所见,我首先截断我的表,然后尝试将字符串值插入到int列中。这个因为失败,然后语句回滚。正如您所看到的,即使我先将其截断,我仍然会在tran1表和tran2表中生成结果。

 BEGIN TRANSACTION;
 BEGIN TRY

 truncate table dbo.tran1;
 truncate table dbo.tran2;
 INSERT INTO dbo.Tran1
 values ('ost')

 INSERT INTO dbo.tran2
 values('gert')

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

如果你想要它与你的错误日志,它看起来像这样:

BEGIN TRANSACTION;
BEGIN TRY

truncate table dbo.tran1;
truncate table dbo.tran2;


INSERT INTO dbo.tran2
values('frands')
INSERT INTO dbo.Tran1
values ('hans')


END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
INSERT INTO Errors (errornumber, errorseverity, errorstate, errorprocedure, 
errorline, errormessage)
VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), 
ERROR_LINE(), ERROR_MESSAGE())
END CATCH;
IF @@TRANCOUNT > 0 COMMIT TRANSACTION;

<强>表格

enter image description here enter image description here

<强>结果 enter image description here

错误日志的结果 enter image description here