1

SQL Server 2008で小さなバグ(機能)に遭遇しました。

@tranという名前で明示的なトランザクションを開始するストアドプロシージャがあります

....宣言@tranvarchar(30)='exp_trans';

BEGIN TRAN @tran IF @p_param is null ROLLBACK TRAN@tran...。

問題は、IMPLICIT_TRANSACTIONSをONに設定してストアドプロシージャを呼び出すと、フローがロールバックセクションにヒットし、エラーが発生することです。

「メッセージ6401、レベル16、状態1、行10はexp_tranをロールバックできません。その名前のトランザクションまたはセーブポイントが見つかりませんでした。」

これはある種の機能ですか、それとも実際に何が起こっているのですか?前もって感謝します

4

1 に答える 1

0

これはネストされたトランザクションが原因で発生していると思います。SQLServer2008は、トランザクションがネストされている場合の内部トランザクションへのロールバックをサポートしていません。

一連のネストされたトランザクション内の複数のトランザクションにトランザクション名を付けて名前を付けることは、トランザクションにほとんど影響しません。最初の(最も外側の)トランザクション名のみがシステムに登録されます。他の名前(有効なセーブポイント名以外)へのロールバックはエラーを生成します。実際、このエラーが発生した時点では、ロールバックの前に実行されたステートメントはどれもロールバックされません。ステートメントは、外部トランザクションがロールバックされた場合にのみロールバックされます。

暗黙のトランザクション設定が1つを開始し、begin transが2番目の(ネストされた)トランザクションを開始するため、トランザクションはネストされます。そして、それは指定されたトランザクションへのロールバックを失敗させます。

于 2012-11-12T22:42:59.837 に答える