Nhibernateのネストされたトランザクション動作を達成する
-
28-09-2019 - |
質問
Nhibernateのトランザクションコントロールとフラッシュモードオプションを使用して、何らかのネストされたトランザクション動作を実現しようとしていますが、読みすぎた後、物事は少し混乱しているため、以下にリストした事実についての確認は非常に役立ちます。
私が欲しいのは、小さなトランザクションで分割される1つの大きなトランザクションを開くことです。次のシナリオを想像してください。
- TX1はTXを開き、人の記録を挿入します。
- TX2はTXを開き、この人の名前をP2に更新します。
- TX2がコミットします。
- TX3はTXを開き、この人の名前をP3に更新します。
- TX3ロールバック;
- TX1コミット。
NHが挿入物とTX2アップデートをデータベースに送信することを確認したいのですが、TX3がロールバックされたときのことを無視してください。
FlushMode = FlushMode =は、適切な開始/コミット/ロールバックが要求された後にのみセッションをフラッシングしないようにしましたが、NHは常に、コミットとロールバックとは無関係にオブジェクトの最終状態でデータベースを更新します。 それは正常ですか? NHは、FlushMode = whereで作業する際にトランザクションコントロールを実際に無視しますか?
また、FlushMode = CommitとNested Transactionsを使用して使用しようとしましたが、Ado.netは、ネストされたトランザクションは実際には常に同じトランザクションであるため、私は発見しました。
私は「すべてか何もない」行動を達成しようとしていないことに注意してください。私はセーブポイントの働き方をもっと探しています。 NHでそれを行う方法(セーブポイント)はありますか?
前もって感謝します。
フィリペ
解決
この質問を永遠に開いたままにしないようにするために、私たちが採用したソリューションを投稿します。
ネストされたトランザクション動作を管理するコンテナのような作業単位があります。私たちが望む治療の種類に応じて、それは新しいセッションを作成します(またはそうではありません)。例:
- エラーの続行:他のエラーがコミットするトランザクションエラーでもそれが必要な場合、UOWコンテナは「トランザクション」ごとに異なるセッションを使用し、作業の終わりにすべてのTXをフラッシュします。
- エラーのロールバック:セッションロールバック(エラーまたはビジネスロールバックのため)でそれが必要な場合、他のすべてのトランザクションがロールバックされます。UOWコンテナは、ネストされたすべてのトランザクションに対して同じセッションを使用し、最終的にすべての人をロールバックします。
このUOWが操作する「トランザクション」は、NH(ADO.NET)トランザクションではないと言うことが重要です。トランザクションの抽象化を作成したため、トランザクションがコミットまたはロールバックされる可能性がある場合、操作コードは「投票」しますが、選択したエラー戦略に基づいて、すべての終わりに実際のアクションが発生します。
この使用法はあまり一般的ではなく、特定のシナリオにのみ適合していることがわかっています(この場合、バッチ処理の統合シナリオです)ので、今すぐコードを投稿します。この実装が役立つと考えている場合は、メッセージを送ってください。コードを共有できてうれしいです。
よろしく、
フィリペ
他のヒント
Nhibernateは、ネストされたトランザクションをサポートしていません。それぞれのisessionは、せいぜい1つのアクティブなトランザクションを持つことができます。あなたの例のシナリオが私には意味がないので、私はあなたが何を達成しようとしているのかわかりません。挿入後にトランザクション1をコミットすると同じ効果があります。