するときは、ネストされたトランザクションを使用しますか?
コードの再利用するためには、我々は貯蓄プロセスの多くを書きますが、あなたが取引の途中を使用する必要がある場合は必然的に入れ子に発生します。
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が直接ネストされたトランザクションをサポートしていない理由です。
何を達成することができることを?
これは良いデモを与えます
貯蓄プロセスを書面で、我々は、治療トランスかどうかを判断するために、現在のトランス数を決定する必要があります
まず、現在= 0手段なしトランスをカウントしない場合
そして、このプロセスは、トランス貯蓄の作成を担当する必要があります
ロールバックまたはコミットのためにその後も責任を負います。
現在は、トランスされている場合
そして、貯蓄が新しいトランスを作成しませんが、セーブポイントを行うために処理します
エラーがない場合は、コミットするライン上の外の人々への責任を必要としません。
私たちが遭遇したエラーに対処しなければならないので、最初のロールバックは。ポイントを保存する(数を減らすことはありません)
そして、外部にエラーを投げます。
一般の場合には、コアコンセプトは、常に1つのトランザクションのみ営業しており、他の所望の効果を達成するためにポイント+スロー・エラーのセーブポイントのセーブ+ロールバックをトランス+を始めるならば、使用しています
貯蓄は、おそらく長い道のりを処理します
GO IFは、 EXISTS(SELECT名FROM 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 NVARCHAR(4000 )。 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
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://stackoverflow.com/questions/31277829/multiple-begin-transactions