我正在尝试为多个插入创建一个事务,如果一个失败,我希望所有插入都回滚。根据实例,我发现我有这个
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
答案 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;
<强>表格强>