TransactionScopeはすばらしい機能ですが、正しく実装しているプロバイダーは少なすぎます。接続をパラメータとして渡したくありません。
2 に答える
ここでTransactionScopeを使用して何を達成したいかわからない-アイデアがメソッド間でトランザクションの自動フロー(および進行中のトランザクション内の単純な参加)を持つことである場合、パラメーターとして接続を渡すことが唯一の方法ではありません。現在のCallContext(または現在のスレッド)を使用して、現在の接続とトランザクションを渡すことができます。接続/トランザクションが現在の呼び出しコンテキストに存在するかどうかをチェックし、存在しない場合は作成する単純な静的ラッパーを配置します。これは、パラメーターを渡すのとは対照的に、透過的で邪魔にならない方法です。
ここで、アプリドメインの境界を越えて流れるトランザクションや、複数のリソースマネージャーの使用(つまり、分散トランザクションの使用)を検討している場合、最善の策は、TransactionScopeを使用して独自のResourceManagerをロールアウトすることです。もちろん、これは些細なことではありませんが、それが要件に伴うものです。基盤となるシステムがトランザクションリソースを提供しない場合、カスタムリソースマネージャーは、ロールバックを行うために補償トランザクションを使用できます(たとえば、ファイルシステムの最上位のマネージャーは、「フォルダーの作成」の元のトランザクションに対する補償トランザクションとして「フォルダーの削除」を使用できます)。 。
たぶんあなたはシステム普及率を探しています。
基本的に、すべてのトランザクションはジャーナル処理され(トランザクションの詳細が保存されます)、アプリケーションがクラッシュして再起動した場合は、中断したところから再開するか、ジャーナル処理された状態に基づいて変更をロールバックできます。
これは、システム普及率の実装に役立つスナップショットパターンへのリンクです。