SQL Server TRY...CATCH 与 XACT_STATE

标签 sql sql-server msdn

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

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

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

但是我认为 Catch block 只会在发生错误时执行。那么 Catch block 如何执行并且 XACT_STATE 返回 1 呢?这看起来很矛盾。

XACT_STATE 文档中有一条未答复的评论提出了同样的问题

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

最佳答案

@user1181412 我的分析如下: 此评论:

-- A FOREIGN KEY constraint exists on this table.

--This statement will generate a constraint violation error

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

在顶部,您有

SET XACT_ABORT ON;

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

-- 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 block 将会被命中,尽管事务状态是“可提交的”,如XACT_STATE = 1

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

(1 row(s) affected) The transaction is committable.Committing transaction.

关于SQL Server TRY...CATCH 与 XACT_STATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16043513/

相关文章:

c++ - 有没有办法让 MSAA IAccessible 遍历更快?

sql - 如何以通用方式引用另一个数据库

java - 在Mysql中使用If then else

sql-server - 区分 1 :M association Vs 1:M composition in SQL

msdn - 我在哪里可以下载 Visual Foxpro?微软?

c# - 在哪里可以找到 ECDsaCryptoServiceProvider 类

java - jOOQ支持查询本地结果吗?

sql - 替换循环查询

c# - 如何让控制台应用程序不断发送电子邮件?

sql-server - 为什么 redshift 不接受我的固定宽度文本文件