SQL Server TRY...CATCH 与 XACT_STATE

2024-01-08

我对 MSDN 文档有疑问TRY CATCH块。查看这篇文章并向下滚动到示例 C“使用 TRY…CATCH 和 XACT_STATE”

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

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

不过我认为 Catch 块只会在出现错误时执行。那么 Catch 块如何执行并且XACT_STATE返回1?这似乎是矛盾的。

内有一条未回复的评论XACT_STATE提出同样问题的文档

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


@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;

但是,如果更改为“SET XACT_ABORT OFF;”那么 CATCH 块将会被命中,尽管事务状态是这样的will“可承诺”为XACT_状态 = 1.

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

(1 行受影响)事务可提交。正在提交 交易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server TRY...CATCH 与 XACT_STATE 的相关文章

随机推荐