2012-01-03 7 views
6

をキャンセルした後、まだ開いている、私はこのようなパターンを使用しています:私は、SQL Server Management Studioの上のボタン「クエリを実行キャンセル」打ったときトランザクションは、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 

それは、クエリや葉をキャンセルトランザクションは開かれます。

これは意図した動作ですか?それとも私のパターンに間違いがありますか?トランザクションをロールバックすべきではありませんか?

答えて

9

IMHO、これは意図された動作です。開いているトランザクションがある場合にクエリー実行をキャンセルすると、明示的にコミットまたはロールバックするまで開いています。または接続が閉じられない限り

パターンには間違いがありません。実行フローを手動で制御する場合(クエリの実行をキャンセルする場合)、開かれたトランザクションを同じ方法で手動で処理する必要があります。

更新:クエリがを実行した後

が行動をSSMSオプション切り離しによって制御される - クエリが実行した後に切断することを意味し、またはキャンセルして戻って開かれたトランザクションをロールた:

+0

を参照してください。更新された答え –

+2

この回答は、質問の精神を回避するようだ...質問は、 "クエリをキャンセルするとtry/catch構造の"キャッチ "ブロックがトリガーされないのはなぜですか?これが意図された動作であれば、なぜですか?そのprocのデザイナーとして、私はprocが正常に完了するかロールバックすることを期待しています - try/catchの暗黙のセマンティクスは "実行を停止しますが、キャッチブロックを心配する必要はなく、トランザクションをSQLサーバー断線時には、そのときの処理をクリーンアップすることにします... "正気な行為は、"キャンセルエラー "を引き起こすことでしょう、確かに? – Tao

+0

@タオあなたは正しいかもしれませんが、作者は答えを受け入れました。お願いします。 –