2013-04-16 107 views
5

我有一个关于TRY CATCH块的MSDN文档的问题。看看这篇文章,向下滚动到实例C“使用TRY ... CATCH与XACT_STATE”SQL Server TRY ... CATCH与XACT_STATE

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

示例首先放在try块中的一个COMMIT TRANSACTION,然后放置在catch块,如果XACT_STATE()=1的第二个。

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

有这问同样的问题

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

+0

小心选择一个答案或提供一个?对于你的代表将会有很长的路要走 – dotnetguy

回答

2

@ user1181412我的分析如下XACT_STATE文档中一个悬而未决的评论: 本评论:

- 外键约束存在于此表上。

--This语句将产生一个违反约束错误

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

在顶部,你有

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块将被击中,尽管事务状态“可提交”为XACT_STATE = 1

注意:删除仍然无法做到的约束冲突仍然存在,但你会看到印:

(1行(S)的影响)本次交易committable.Committing 交易。