2013-04-16 136 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 交易。