2

設計上の問題の解決策を探しています。これには少し説明が必要です。コードを投稿しますが、これはさらに長くなります。

必要に応じてビジネス オブジェクトを保持するために使用するカスタム ジェネリック コレクションがあります。参照しやすいように、ビジネス オブジェクトBOと汎用コレクションGCを呼び出します。GC の内部には、削除のフラグが立てられたビジネス オブジェクトのプライベート コレクションがあります。このプライベート コレクションをPDCと呼びます。

それぞれが独自の PDC を持つ任意の数の GC と、コレクションに含まれていない他の BO を同時に持つことができます。

変更を保存するときは、すべての BO と GC をループして、それぞれに変更を保存させます。これは TransactionScope にラップされて発生するため、適切に保存できない場合はデータベースの変更をロールバックします。

GC の保存時に、その PDC の状態に問題があります。GC は、最初にすべての BO を更新とともに保存し、次に PDC 内の BO に関連付けられたレコードを削除してから、すべての BO の PDC をクリアします。これを行うのは、GC の状態がデータベースの新しい状態を正しく反映するようにするためです。

ここで、1 つ以上の GC が正常に保存された後、BO または GC が保存に失敗したとします。TransactionScope はロールバックを実行します。データベースから削除されたレコードは復元されますが、PDC の一部またはすべてが消去され、その状態情報が失われます。

ここに私の難問があります: コミットが発生するまで PDC 情報を保持し、適切なコレクションがクリアされることを保証するにはどうすればよいですか?

TransactionScope には、変更がいつコミットされたかを知らせるためにキャッチできるイベントがありません。特定のトランザクションによって影響を受ける可能性のある多くの BO と GC があるため、一度に 1 つの GC を処理するようにトランザクションを制限することはできません。

助言がありますか?

4

1 に答える 1

2

TransactionStarted はトランザクション マネージャーによって発生し、TransactionCompleted はトランザクション自体によって発生します。

GC にIEnlistmentNotificationを実装させたい場合があります。あなたを助けるかもしれない例があります。

また、 DNR TV ショー 113および114を確認することもできます。

于 2009-07-02T18:32:56.940 に答える