2012-01-03 36 views
6

在SQL Server 2008中打開後,我使用這樣的模式:成交仍取消查詢

begin transaction 

begin try 

/* do something */ 

end try 

begin catch 

if @@TRANCOUNT > 0 
rollback 

DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int        
    SELECT @ErrMsg = ERROR_MESSAGE(),        
     @ErrSeverity = ERROR_SEVERITY()        

    RAISERROR(@ErrMsg, @ErrSeverity,1)  

end catch 

if @@TRANCOUNT > 0 
commit transaction 

時,我打「取消執行查詢」上的SQL Server Management Studio中按鈕,它取消查詢和葉交易開放。

這是預期的行爲?或者我的模式有錯誤。它不應該回滾交易嗎?

回答

9

恕我直言,這是一個預期的行爲。當您取消查詢運行,如果有打開的事務 - 直到你明確地提交或回滾OR,直到連接不會關閉

沒有在你的模式任何有價值的錯誤,它仍然是開放的。如果您手動控制執行流程(取消執行查詢),那麼您應該以相同的方式關注已打開的事務 - 手動。

更新:

行爲由SSMS控制選項查詢後斷開執行 - 這意味着,執行後查詢斷開或取消,並回滾打開事務:

+0

見更新回答 – 2012-01-03 07:42:00

+2

這個答案似乎迴避了這個問題的精神......這個問題可以改寫爲「爲什麼取消查詢不會觸發try/catch構造的」catch「塊?如果這是有意的行爲,爲什麼?作爲該proc的設計者,我期望proc能夠成功完成或回滾 - try/catch的隱含語義不允許「停止執行,但不必擔心catch塊,並保持事務處於打開狀態,直到SQL服務器決定在斷開連接時清理交易「......一個理智的行爲當然是提高」取消錯誤「,當然? – Tao 2013-11-09 00:16:34

+0

@Tao也許你是對的,但作者接受了答案,請不要爲他考慮。 – 2013-11-09 15:45:00