SQL Serverの研究ノート(ネストされたトランザクションのネストされたトランザクション)

するときは、ネストされたトランザクションを使用しますか? 

コードの再利用するためには、我々は貯蓄プロセスの多くを書きますが、あなたが取引の途中を使用する必要がある場合は必然的に入れ子に発生します。

SQL Serverは、直接ネストされたトランザクションをサポートしていませんが、それは、ネストされた効果を実装するために動きのいくつかを使用することができます。これらの動きは、エレガントではありませんが、だけでなく、簡単に霧の中に落下します。 

情報の一部のこのコレクションは、ネストされたトランザクションのSQL Serverで述べています。 

トランザクションのこの書き込み基本的なSQL Serverの取り扱いがある  https://www.cnblogs.com/kymo/archive/2008/05/14/1194161.html

 

トランス@@数+1を開始

カウント-1、-1 0その後、後に恒久的にディスクに書き込まれている場合、それ以外のコミットを待ち続け下@@トランスコミット。

(ポイント名セーブ・ロールバック+保持カウント、カウントが更新されません)ロールバックトランス@@数= 0

 

カウントが直接0アップに設定されているので、そう頻繁に出会い、トランスの外側にトランスrollabck後にあるバグは、破壊され、ロールバックコミットすることはできませんすることはできません。

SQL Serverが直接ネストされたトランザクションをサポートしていない理由です。

何を達成することができることを? 

これは良いデモを与えます

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-ver15

https://stackoverflow.com/questions/9713350/save-transaction-vs-begin-transaction-sql-server-how-to-nest-transactions-nice

貯蓄プロセスを書面で、我々は、治療トランスかどうかを判断するために、現在のトランス数を決定する必要があります 

まず、現在= 0手段なしトランスをカウントしない場合 

そして、このプロセスは、トランス貯蓄の作成を担当する必要があります 

ロールバックまたはコミットのためにその後も責任を負います。 

現在は、トランスされている場合 

そして、貯蓄が新しいトランスを作成しませんが、セーブポイントを行うために処理します

エラーがない場合は、コミットするライン上の外の人々への責任を必要としません。 

私たちが遭遇したエラーに対処しなければならないので、最初のロールバックは。ポイントを保存する(数を減らすことはありません)

そして、外部にエラーを投げます。 

一般の場合には、コアコンセプトは、常に1つのトランザクションのみ営業しており、他の所望の効果を達成するためにポイント+スロー・エラーのセーブポイントのセーブ+ロールバックをトランス+を始めるならば、使用しています

貯蓄は、おそらく長い道のりを処理します

GO   
IFは、 EXISTSSELECTFROM sys.objects  
           = N ' SaveTranExample ' DROP PROCEDURE SaveTranExample。  
GOは、CREATE PROCEDURE SaveTranExample
 ASのDECLARE @TranCounter INTをSET @TranCounter = @@ TRANCOUNT IF @TranCounter > 0 SAVE TRANSACTION ProcedureSave。  
    ELSE BEGIN TRANSACTIONを   
   
    
              
           
         ;
        プリント@@ TRANCOUNT 更新カテゴリーセット=  ' MK100 '  Idは= 1 - 修正データベース。  BEGIN TRYを  
         IF @TranCounter = 0 COMMIT TRANSACTIONをENDのTRYは、  
     BEGIN CATCHを  
         IF @TranCounter = 0 ROLLBACK TRANSACTION ELSE IF XACT_STATE() <> - 
         
                  
               
             1   
                ROLLBACK  TRANSACTION ProcedureSave。  
        DECLARE  @ErrorMessage  NVARCHAR4000 )。  
        DECLARE  @ErrorSeverity  INT DECLARE  @ErrorState  INT 
  
        SELECT  @ErrorMessage  = ERROR_MESSAGE()。  
        SELECT  @ErrorSeverity  = ERROR_SEVERITY()。  
        SELECT  @ErrorState  = ERROR_STATE()。  
  
        RAISERROR@ErrorMessage- メッセージテキスト   
                   @ErrorSeverity-重大度。  
                   @ErrorState  - 国家。  
                   );  
    ENDのCATCH  
 GO  

この呼び出しがある場合には

選択 *  から製品順番 によって同上。
アップデート製品は、設定=  asdds  イド= 1 ;
アップデート製品は、設定= asdwf イド= 2 ; 開始TRAN 更新製品設定= ' MK100 ' Idは= 2 ;
開始トライ
     幹部を    

 
   SaveTranExample;
    コミット;
エンド試しが 
 始まるキャッチ
     印刷エラーロールバックをエンドキャッチ

XACT_STATEを説明

 

外はその後、プロセスは責任をロールバックが、ここでは外に引き渡さ責任がどうあるべきか、保存することができますので、エラーを保存するプロセスでは、実際にのみ、うまく投げるとき。現在の決定がコミットされていない場合、それはまたになります-1外は確かにロールバックするので、実行しません 

しかし、場合には、それは1または0が、その後外部に責任が残り、ポイントのみを保存するためにのみロールバックコミットすることができます。ロールバックのみこの手段貯蓄が処理、外はまだ必要に応じてコミットします。唯一の柔軟な方法友人。

 

また言及に、EFコアは、ネストされたトランザクションをサポートしていない、またはトランザクションスコープは、結果に到達するために使用する必要があります。

https://github.com/aspnet/EntityFrameworkCore/issues/3470

https://github.com/aspnet/EntityFrameworkCore/issues/6233

 

その他には、参照してください。 

https://docs.microsoft.com/en-us/sql/t-sql/functions/xact-state-transact-sql?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/t-sql/functions/xact-state-transact-sql?view=sql-server-ver15

https://www.cnblogs.com/xugang/archive/2011/04/09/2010216.html

https://stackoverflow.com/questions/16043513/sql-server-try-catch-with-xact-state

https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/

https://stackoverflow.com/questions/527855/nested-transactions-in-sql-server

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms189336(v=sql.105)?redirectedfrom=MSDN

https://stackoverflow.com/questions/9713350/save-transaction-vs-begin-transaction-sql-server-how-to-nest-transactions-nice

http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/

https://github.com/aspnet/EntityFrameworkCore/issues/3470

https://github.com/aspnet/EntityFrameworkCore/issues/6233

https://www.cnblogs.com/kymo/archive/2008/05/14/1194161.html

https://blog.csdn.net/kufeiyun/article/details/27533853

https://www.mssqltips.com/sqlservertip/4897/handling-transactions-in-nested-sql-server-stored-procedures/

https://stackoverflow.com/questions/31277829/multiple-begin-transactions

 

おすすめ

転載: www.cnblogs.com/keatkeat/p/11830113.html