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でそれを行う方法(セーブポイント)はありますか?
前もって感謝します。
フィリペ