ロールバックを行う場合、トランザクションは慎重になるのSQLServer(転載)
慎重にケースを研究し、明示的なトランザクション(表示トランザクション)の内部を見つけるSQL Serverは、まだ少し複雑です。以下は、いくつかの要約です:
トランザクションのコミットにすべてのネストされたトランザクションの変更をコミットします。ポイントを保存するには、ネストされたトランザクションのロールバックTRANがある場合は、[保存ポイントの後の部分が出て戻ります。
dbo.numbertableから削除 始めるTRAN OUT1 インサートdbo.numbertable値(1)に dbo.numbertable値への挿入(2) 開始TRAN INN1 インサートdbo.numbertable値(3)に dbo.numbertable値(4)への挿入 保存TRAN inn1SavePoint (5)dbo.numbertable値挿入 ロールバックトランinn1SavePoint コミットトランINN1 コミットTRAN OUT1
@@ TRANCOUNTがセッションは、ネストされたという点で取引のために、現在のトランザクションの数を記録するために使用することができ、それは、トランザクションにそれがTRANマイナス1をコミットしますたびに毎回プラスワンを開始します。だから、選択@@ TRANCOUNTによってトランザクションの現在のかどうかを確認することができ声明インチ 現在の@@ TRANCOUNTが0である場合は、そのステートメントがコミットまたはロールバックが表示されます呼び出すことが間違っています。これは、ネストされたトランザクションでは、ROLLBACKは、それが直接0 @@ TRANCOUNTに設定され、非常に特別です。
TRAN開始 TRAN開始 トラン始める @@ TRANCOUNT印刷を ロールバックトラン 印刷@@ TRANCOUNT
ネストされた取引条件については、ロールバック言葉遣いは非常に特別です。巣、ロールバックトランザクションは、トランザクションの名前を取り戻すことができない場合は、唯一の最も外側のトランザクション名をもたらすことです。ロールバックは、ROLLBACK文の前にトランザクションをネストされたすべての変更を破棄します。ロールバックした後、@@ TRANCOUNTをロールバックがautocmmit取引、自動送信属し、明示的なトランザクション属していない、文の後に、0次のとおりです。しかし、ロールバックを更新した後、まだので、それは、望んで提出します。
dbo.numbertableから削除 TRAN T1始める dbo.numbertable値(1)に挿入し TRAN t2の始まり (2)dbo.numbertable値への挿入を ロールバックトラン プリント「innertトランザクションでロールバックした後、トランザクション数は次のとおりです。」+キャスト(@@ TRANCOUNT、VARCHAR(5)) dbo.numbertable値への挿入(3) --commit TRAN dbo.numbertable SELECT * FROM
ストアドプロシージャの場所を呼び出す場合、トランザクションを開始することができますストアドプロシージャは、ロールバック内部のストアドプロシージャの結果は、上記と同じ得れば、これはまた、ネストされたトランザクションに属し、トランザクションを開始します。しかし、ストアドプロシージャの実行の終了と時間で一つの特別な場所が同じでない場合に実行した後、SQLSERVERは、「トランザクション・カウントのようなメッセージを与えるだろう、@@ TRANCOUNTストアドプロシージャとTRANCOUNT @@の終了時刻の値を比較することを開始しますCOMMITまたはROLLBACK TRANSACTIONステートメントが欠落していることを示している。前のカウント= 1、現在の数= 0「のメッセージが解析がその後の影響はありません。
PROCEDURE [DBO]。[AddNumber] CREATE AS BEGIN TRAN開始 dbo.numbertable値にインサート(1) dbo.numbertable値への挿入(2) dbo.numbertable値への挿入(3) ロールバックトラン END dbo.numbertableから削除を TRANを開始OUT1 EXEC dbo.addnumber @@ TRANCOUNTプリント dbo.numbertable値に(3)を挿入し dbo.numbertable SELECT * FROM
ストアドプロシージャの内部にロールバックを行う場合は、それを行うための外は、コミットまたは一度内部にネストされたトランザクションのトランザクションはロールバックを呼び出すためのロールバックは、効果的ではないと文句を言うだろう、@@ 0にTRANCOUNT、および外側にまたはコミットロールバックは、エラーを指示します。このようなSPとして、私はSPの内部ROLLBACK文ので、間違っている、最も外側にロールバックを想像してみてください。最後に、そこには常にテーブル値3に挿入されます。
dbo.numbertableから削除 始めるトランOUT1 のexec dbo.addnumber 印刷@@ TRANCOUNT 挿入dbo.numbertable値(3)への ロールバックトランOUT1 dbo.numbertableから選択*
だから、ネストされた取引条件、取引のための内部ロールバックに一度の取引は、ピットの外に残される場合。で、この問題を解決するために、2つの解決策があります
1.この値は、あなたが内部トランザクションのロールバックの説明、および何それがコミットまたはロールバックし続けることができないことTRANを、開始コードと一致している場合、@@ TRANCOUNT、トランザクションの外を確認してください。
dbo.numbertableから削除 TRAN T1始める (1)dbo.numbertable値への挿入を トランザクションT2の開始 dbo.numbertable値への挿入(2) ロールバックTRAN @@ TRANCOUNT = 1であれば 開始 (3)dbo.numbertable値にインサート TRANコミット 端を
のみコミットすることができ、すべての内部取引で2.ロールバックすることはできません。あなたはそれを行う方法を、ロールバックする必要がありますか?保存ポイントが便利になることができます。SPは、次の例のように変更されました:
ALTER PROCEDURE [DBO]。[AddNumber】 AS BEGIN TRANを開始 TRAN PPの保存 (1)dbo.numbertable値にインサート dbo.numbertable値にインサート(2) dbo.numbertable値への挿入(3) ロールバックTRAN PP TRANコミット ENDを 始めますTRAN OUT1 EXEC dbo.addnumber 印刷@@ TRANCOUNT インサートdbo.numbertable値(3)に コミットTRAN OUT1
慎重にケースを研究し、明示的なトランザクション(表示トランザクション)の内部を見つけるSQL Serverは、まだ少し複雑です。以下は、いくつかの要約です:
トランザクションのコミットにすべてのネストされたトランザクションの変更をコミットします。ポイントを保存するには、ネストされたトランザクションのロールバックTRANがある場合は、[保存ポイントの後の部分が出て戻ります。
dbo.numbertableから削除 始めるTRAN OUT1 インサートdbo.numbertable値(1)に dbo.numbertable値への挿入(2) 開始TRAN INN1 インサートdbo.numbertable値(3)に dbo.numbertable値(4)への挿入 保存TRAN inn1SavePoint (5)dbo.numbertable値挿入 ロールバックトランinn1SavePoint コミットトランINN1 コミットTRAN OUT1
@@ TRANCOUNTがセッションは、ネストされたという点で取引のために、現在のトランザクションの数を記録するために使用することができ、それは、トランザクションにそれがTRANマイナス1をコミットしますたびに毎回プラスワンを開始します。だから、選択@@ TRANCOUNTによってトランザクションの現在のかどうかを確認することができ声明インチ 現在の@@ TRANCOUNTが0である場合は、そのステートメントがコミットまたはロールバックが表示されます呼び出すことが間違っています。これは、ネストされたトランザクションでは、ROLLBACKは、それが直接0 @@ TRANCOUNTに設定され、非常に特別です。
TRAN開始 TRAN開始 トラン始める @@ TRANCOUNT印刷を ロールバックトラン 印刷@@ TRANCOUNT
ネストされた取引条件については、ロールバック言葉遣いは非常に特別です。巣、ロールバックトランザクションは、トランザクションの名前を取り戻すことができない場合は、唯一の最も外側のトランザクション名をもたらすことです。ロールバックは、ROLLBACK文の前にトランザクションをネストされたすべての変更を破棄します。ロールバックした後、@@ TRANCOUNTをロールバックがautocmmit取引、自動送信属し、明示的なトランザクション属していない、文の後に、0次のとおりです。しかし、ロールバックを更新した後、まだので、それは、望んで提出します。
dbo.numbertableから削除 TRAN T1始める dbo.numbertable値(1)に挿入し TRAN t2の始まり (2)dbo.numbertable値への挿入を ロールバックトラン プリント「innertトランザクションでロールバックした後、トランザクション数は次のとおりです。」+キャスト(@@ TRANCOUNT、VARCHAR(5)) dbo.numbertable値への挿入(3) --commit TRAN dbo.numbertable SELECT * FROM
ストアドプロシージャの場所を呼び出す場合、トランザクションを開始することができますストアドプロシージャは、ロールバック内部のストアドプロシージャの結果は、上記と同じ得れば、これはまた、ネストされたトランザクションに属し、トランザクションを開始します。しかし、ストアドプロシージャの実行の終了と時間で一つの特別な場所が同じでない場合に実行した後、SQLSERVERは、「トランザクション・カウントのようなメッセージを与えるだろう、@@ TRANCOUNTストアドプロシージャとTRANCOUNT @@の終了時刻の値を比較することを開始しますCOMMITまたはROLLBACK TRANSACTIONステートメントが欠落していることを示している。前のカウント= 1、現在の数= 0「のメッセージが解析がその後の影響はありません。
PROCEDURE [DBO]。[AddNumber] CREATE AS BEGIN TRAN開始 dbo.numbertable値にインサート(1) dbo.numbertable値への挿入(2) dbo.numbertable値への挿入(3) ロールバックトラン END dbo.numbertableから削除を TRANを開始OUT1 EXEC dbo.addnumber @@ TRANCOUNTプリント dbo.numbertable値に(3)を挿入し dbo.numbertable SELECT * FROM
ストアドプロシージャの内部にロールバックを行う場合は、それを行うための外は、コミットまたは一度内部にネストされたトランザクションのトランザクションはロールバックを呼び出すためのロールバックは、効果的ではないと文句を言うだろう、@@ 0にTRANCOUNT、および外側にまたはコミットロールバックは、エラーを指示します。このようなSPとして、私はSPの内部ROLLBACK文ので、間違っている、最も外側にロールバックを想像してみてください。最後に、そこには常にテーブル値3に挿入されます。
dbo.numbertableから削除 始めるトランOUT1 のexec dbo.addnumber 印刷@@ TRANCOUNT 挿入dbo.numbertable値(3)への ロールバックトランOUT1 dbo.numbertableから選択*
だから、ネストされた取引条件、取引のための内部ロールバックに一度の取引は、ピットの外に残される場合。で、この問題を解決するために、2つの解決策があります
1.この値は、あなたが内部トランザクションのロールバックの説明、および何それがコミットまたはロールバックし続けることができないことTRANを、開始コードと一致している場合、@@ TRANCOUNT、トランザクションの外を確認してください。
dbo.numbertableから削除 TRAN T1始める (1)dbo.numbertable値への挿入を トランザクションT2の開始 dbo.numbertable値への挿入(2) ロールバックTRAN @@ TRANCOUNT = 1であれば 開始 (3)dbo.numbertable値にインサート TRANコミット 端を
のみコミットすることができ、すべての内部取引で2.ロールバックすることはできません。あなたはそれを行う方法を、ロールバックする必要がありますか?保存ポイントが便利になることができます。SPは、次の例のように変更されました:
ALTER PROCEDURE [DBO]。[AddNumber】 AS BEGIN TRANを開始 TRAN PPの保存 (1)dbo.numbertable値にインサート dbo.numbertable値にインサート(2) dbo.numbertable値への挿入(3) ロールバックTRAN PP TRANコミット ENDを 始めますTRAN OUT1 EXEC dbo.addnumber 印刷@@ TRANCOUNT インサートdbo.numbertable値(3)に コミットTRAN OUT1