2013-07-03 45 views
2

我要回滚在CATCH块中的所有语句时在TRY块中遇到的错误:为什么同样的try catch块有两种不同的结果

BEGIN TRY 
    begin transaction 

    create table t3(a int) 
    insert into t3 values(1) 
    insert into t3 values(1,2) --error occur 
    insert into t3 values(3) 

END TRY 
BEGIN CATCH 
    --just take care of rollback 
    IF @@TRANCOUNT <> 0 
    BEGIN 
     PRINT 'in catch,ROLLING BACK'; 
     ROLLBACK 
    END 
END CATCH 
go 

起初错误是因为在PRINT抓CATCH块的作品。但是,经过多次更改后,由于没有更多的打印发生,错误似乎不再被捕获。

no printing out

因此,我打开一个新的查询,并执行相同的事情。这次错误可以再次抓到!

printing out

很抱歉的大图像

+3

不要发布代码的图像,只需将代码粘贴为文本! – Blorgbeard

+0

编译错误通常不可捕捉(除非它们发生在延期编译期间或在子范围内) –

+0

我认为这是一个延迟编译。正如它所显示的那样,第二个错误就是BEGIN CATCH。但在第一个中,似乎错误是由SQL SERVER捕获的。 – FebWind

回答

2

当你运行像Management Studio中的工具这段代码,您的交易编程和维持你的SPID(分配到一个查询窗口)。

所以不一致reult问题是因为你没有在所有的代码路径关闭交易(可以说回滚不到风度到了),您的交易仍然活跃在运行该脚本的下一次。

如果您将IF @@TRANCOUNT <> 0 rollback transaction添加到脚本的开头,您将获得一致的输出。

另请注意,try catch块并不是要在语句编译级别捕获错误。

如果您用除以print 1/0)代替错误,则捕获将正常工作。

编译错误,如语法:

MSDN

以下类型的错误,当他们出现在相同的水平执行的作为TRY ... CATCH构造不是由CATCH块处理错误,这会阻止从 运行批次。

  • 错误中语句级重新编译发生,如对象名解析,因为延迟名称解析的编译后发生
  • 错误。
+0

屏幕截图显示“SET XACT_ABORT ON”。这将在错误时终止交易。 –

+0

马丁,我没有用它:) – FebWind

+0

安德烈,我在两个单独的查询窗口中执行它们。我再试一次。如果我在查询窗口中注销回滚。表A实际上是创建的。然后我切换到另一个查询窗口 – FebWind

相关问题