SQL Server TRY ...使用XACT_STATE进行捕获

ElP*_*nte 7 sql sql-server msdn

我有关于TRY CATCH块的MSDN文档的问题.查看本文并向下滚动到示例C"使用TRY ... CATCH与XACT_STATE"

http://msdn.microsoft.com/en-us/library/ms175976.aspx

该示例首先COMMIT TRANSACTION在Try块中放置一个,然后在Catch块中放置第二个if XACT_STATE()=1.

但是我认为Catch块只会在发生错误时执行.那么Catch块如何执行并XACT_STATE返回1?这似乎是矛盾的.

XACT_STATE文档中有一条未回答的评论,询问同一个问题

http://msdn.microsoft.com/en-us/library/ms189797.aspx

Sud*_*hra 8

@user1181412 我的分析如下: 这条评论:

-- 该表上存在 FOREIGN KEY 约束。

--该语句会产生约束违规错误

是你问题的答案。发生的情况是,当 DELETE 语句执行时,它会生成约束违反错误,并且后续的 COMMIT 不会执行。事务的 XACT_STATE 现在为 1,并且 CATCH 块正在执行。

在顶部,你有

设置 XACT_ABORT 为开;

这会导致事务状态不可提交,因此此代码块将回滚事务:

-- Test whether the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
    PRINT
        N'The transaction is in an uncommittable state.' +
        'Rolling back transaction.'
    ROLLBACK TRANSACTION;
END;
Run Code Online (Sandbox Code Playgroud)

但是,如果更改为“SET XACT_ABORT OFF;” 那么 CATCH 块将被命中,尽管事务状态是“可提交的”,如XACT_STATE = 1

注意:删除仍然不会完成,因为约束违规仍然存在,但您会看到打印的内容:

(1 行受影响)该事务是可提交的。正在提交事务。