2011-05-11 107 views
3

这种情况会发生什么?这里发生了什么? SQL Server - XACT_ABORT ON + @@ ERROR检查。 。

SET XACT_ABORT ON 

BEGIN TRANSACTION 

    ---DO SOMETHING HERE THAT CAUSES AN ERROR 

COMMIT TRANSACTION 

if @@error != 0 
raiserror('SP failed. Step 7.', 20, -1) with log GO 

我的猜测是因为XACT_ABORTONCOMMIT TRANSACTION从未发生(因为整个事情是回滚和终止的),而且也没有最后一条语句(检查@@error,然后调用raiseerror)。

回答

3

正确。

SET XACT_ABORT跳出批处理。你的IF是同一批次的一部分。

如果您想对错误进行一些处理,然后用BEGIN TRY等

SET XACT_ABORT ON 
BEGIN TRY 
BEGIN TRANSACTION 

    ---DO SOMETHING HERE THAT CAUSES AN ERROR 

COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    raiserror('SP failed. Step 7.', 20, -1) with log 
END CATCH 
GO 

我也好奇的严重性20,因为它打破了连接。通常你会使用16这是用户定义的错误。

+0

@gbn:谢谢。因为那是在尝试...赶上...如果之后有声明,他们会执行,正确吗?如果他们这样做,他们会以同样的方式对xact_abort做出反应,即。 xact_abort会适用于SP中的每个事务吗?或者只是第一个?听起来像我知道的一个愚蠢的问题,但我只是想确定。 – richard 2011-05-11 19:22:41

+0

只是为了澄清。 。 。如果没有try/catch,整个事情就会终止,没有任何语句会被执行。用try/catch,它会中止那个事务,但是接着转到下一个语句? – richard 2011-05-11 19:23:50

+0

XACT_ABORT ON适用于整个范围/批次。这是一个存储过程。是的,在CATCH执行后的代码 – gbn 2011-05-11 19:24:03

相关问题