我有以下错误处理代码:
Create PROC myProc(--Parameters--)
BEGIN
SET NOCOUNT ON
BEGIN TRAN
--My Code, combination of insertion and deletion
IF @@Error<>0
Goto ErrorSection
COMMIT TRAN
Return 0
ErrorSection:
ROLLBACK TRAN
raiserror(@error, 1, 2) with seterror
return -1
END
每当我检查@@ Error&lt;&gt; 0的条件通过时,我的控件执行ErrorSection代码并且通过错误, &#34; EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 1,当前计数= 0。&#34;
我很困惑,当控制到达ErrorSection时,我应该有一个活动事务立即回滚。那么为什么我会收到这个错误。
我还阅读了一些答案并使用&#34; SET XACT_ABORT ON&#34;保存我这个错误的属性。我也应该使用TRY-CATCH块。由于Rollback还将事务计数减少到零,所以当我的rollback语句成功执行时,为什么我会收到此错误。
我也注意到这个错误是在Return -1语句之上生成的,然后返回-1。
请建议为什么我在回滚成功运行时遇到此错误以及&#34; SET XACT_ABORT ON&#34;让我免于同样的事。
答案 0 :(得分:0)
避免使用GOTO语句进行错误处理。相反,使用TRY ... CATCH来处理错误和回滚事务:
BEGIN TRANSACTION;
BEGIN TRY
-- Code that might generate an error here
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
-- Your custom code for error handling here
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
-- Clean-up code here
GO