トランザクションスコープもネストされたトランザクションもサポートされていない場合はどうすればよいですか?
-
27-09-2019 - |
質問
Transactionscopeは素晴らしい機能ですが、プロバイダーが正しく実装するプロバイダーが少なすぎます。接続をパラメーターとして渡したくありません。
解決
ここでTransactionscopeを使用して何を達成したいのかわからない - アイデアがメソッド間のトランザクションの補助フロー(および継続的なトランザクション内での単純な入隊)がある場合、パラメーターとして接続を渡すことが唯一の方法ではありません。電流を使用して現在の接続とトランザクションを渡すことができます CallContext (または現在のスレッド)。現在のコールコンテキストに接続/トランザクションが存在し、そうでない場合に作成するかどうかを確認する単純な静的ラッパーを置きます。これは、パラメーターを通過するのではなく、透明な非侵入方法です。
これで、アプリドメインの境界を越えて流れるトランザクションを検討している場合、および/または複数のリソースマネージャー(つまり、分散トランザクションを使用する)を使用している場合、トランザクションスコープを使用して展開することが最善です あなた自身のResourceManager. 。もちろん、これは些細なことではありませんが、それは要件に伴うものです。基礎となるシステムがトランザクションリソースを提供していない場合、カスタムリソースマネージャーはロールバックを使用するために補償トランザクションを使用できます(たとえば、ファイルシステムの上部のマネージャーは、「フォルダーの作成」の元のトランザクションに対する補償トランザクションとして「削除フォルダー」を使用できます) 。
他のヒント
多分あなたは探しています システムの有病率.
基本的に、すべてのトランザクションはです ジャーナル (トランザクションの詳細が保存されます)、アプリケーションがクラッシュして再起動した場合、途中降機から拾うか、ジャーナル状態に基づいて変更をロールバックできます。
これが次のリンクです スナップショットパターン それはあなたがシステムの有病率を実装するのに役立ちます。