5

NHibernate のトランザクション制御と FlushMode オプションを使用して、ある種のネストされたトランザクション動作を実現しようとしていますが、読みすぎて少し混乱してしまったので、以下にリストする事実についての確認は非常に役立ちます。

私が望むのは、小さなトランザクションに分割される 1 つの大きなトランザクションを開くことです。次のシナリオを想像してください。

  • TX1 は TX を開き、個人のレコードを挿入します。
  • TX2 は TX を開き、この Person の名前を P2 に更新します。
  • TX2 コミット;
  • TX3 は TX を開き、この人の名前を P3 に更新します。
  • TX3 ロールバック。
  • TX1 はコミットします。

NH が INSERT と TX2 UPDATE をデータベースに送信し、ロールバックされた TX3 を無視することを望みます。

FlushMode = Never を使用して、適切な Begins/Commits/Rollbacks が要求された後にのみセッションをフラッシュしようとしましたが、コミットやロールバックとは関係なく、NH は常にオブジェクトの最終状態でデータベースを更新します。それは正常ですか?FlushMode = Never で作業する場合、NH は本当にトランザクション制御を無視しますか?

FlushMode = Commit を使用してネストされたトランザクションを開くことも試みましたが、ADO.NET のため、ネストされたトランザクションは実際には常に同じトランザクションであることがわかりました。

「オールオアナッシング」の動作を達成しようとしているわけではないことに注意してください。私はセーブポイントの働き方にもっと目を向けています。NHでそれを行う方法(セーブポイント)はありますか?

前もって感謝します。

フィリペ

4

2 に答える 2

8

この質問をいつまでも放置しないように、私たちが採用した解決策を投稿します。

ネストされたトランザクションの動作を管理するコンテナーのような作業単位があります。必要な処理の種類に応じて、新しいセッションが作成されます (または作成されません)。例:

  • エラー時に続行: トランザクション エラーで他のトランザクションがコミットされた場合でも、UoW コンテナーは「トランザクション」ごとに異なるセッションを使用し、作業の最後にすべての tx をフラッシュします。
  • エラー時のロールバック: セッション ロールバックで (エラーまたはビジネス ロールバックが原因で) 他のすべてのトランザクションがロールバックされるようにしたい場合、UoW コンテナーはネストされたすべてのトランザクションに対して同じセッションを使用し、最終的に全員をロールバックします。

この UoW が操作する「トランザクション」は、直接 NH (ADO.NET) トランザクションではないことに注意してください。トランザクションの抽象化を作成したので、トランザクションがコミットまたはロールバックされるかどうかを操作コードが「投票」しますが、実際のアクションは、選択したエラー戦略に基づいて、すべての最後に発生します。

この使用法はあまり一般的ではなく、特定のシナリオ (この場合はバッチ処理との統合シナリオ) にのみ適合することがわかっているため、コードを投稿します。この実装が役立つと思われる方がいらっしゃいましたら、メッセージをお送りください。喜んでコードを共有させていただきます。

よろしく、

フィリペ

于 2010-04-26T21:09:37.147 に答える
1

Hibernate はネストされたトランザクションをサポートしていません。各 ISession は、最大 1 つのアクティブなトランザクションを持つことができます。あなたの例のシナリオは私には意味がないので、あなたが何を達成しようとしているのかわかりません. 挿入後にトランザクション 1 をコミットしても、同じ効果があります。

于 2010-04-20T02:33:26.277 に答える