ロールバックを行うときには注意するトランザクションSQLServerのロールバック(転載)を行う時の取引は慎重になるのSQLServer(転載)

ロールバックを行う場合、トランザクションは慎重になるの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
コードをコピー

おすすめ

転載: www.cnblogs.com/itjeff/p/12106451.html