2009-07-02 17 views
2

私は設計上の問題の解決策を探しています。これは少し説明します。私はコードを投稿しますが、そのwoulはこれをさらに長くします。TransactionScopeとオブジェクトの状態をロールバックする

私は、必要に応じてBusiness Objectsを保持するために使用するカスタム汎用コレクションを持っています。参照を容易にするため、ビジネスオブジェクトBOと総称コレクションGCを呼び出します。 GCの中に私は、削除のフラグが付けられているそれらのビジネスオブジェクトのプライベートコレクションを持っています。このプライベートコレクションに電話するPDC

私は、任意のGCの数、自分のPDCとそれぞれ、いずれかの時点で、プラス任意のコレクションに含まれていない他のBOを持つことができます。

私が変更を保存すると、私はすべてのBOとGCをループし、それぞれが変更を保存するようにします。これは、TransactionScopeでラップされているので、何かが正しく保存されなかった場合、データベースの変更をロールバックします。

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

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

は私quandryです:コミット実行後まではどのように周りのPDCの情報を保持しない、その後appriopriateコレクションがクリアされている保証、発生しましたか?

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

提案がありますか?

答えて

2

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

IEnlistmentNotificationを実装するGCが必要な場合があります。あなたに役立つ例があります。

またDNR TV show 113114をチェックすることもできます。

+0

これは完璧に見えます。リンクもありがとう。これは私の問題を解決するはずです –

関連する問題