我正在尝试使用 NHibernate 的事务控制和 FlushMode 选项来实现某种嵌套事务行为,但是在阅读过多之后事情变得有点混乱,所以任何关于我在下面列出的事实的确认都将非常有用。
我想要的是打开一项拆分为小交易的大交易。想象以下场景:
- TX1 打开一个 TX 并插入一个 Person 的记录;
- TX2 打开一个 TX 并将这个人的名字更新为 P2;
- TX2 提交;
- TX3 打开一个 TX 并将这个人的名字更新为 P3;
- TX3 回滚;
- TX1 提交;
我希望看到 NH 将 INSERT 和 TX2 UPDATE 发送到数据库,只是忽略 TX3,因为它已回滚。
我尝试使用 FlushMode = Never 并且仅在要求正确的开始/提交/回滚后刷新会话,但 NH 始终使用对象的最终状态更新数据库,与提交和回滚无关。这正常吗?当使用 FlushMode = Never 时,NH 是否真的忽略了事务控制?
我也尝试使用 FlushMode = Commit 并打开嵌套事务,但我发现,因为 ADO.NET,嵌套事务实际上总是相同的事务。
请注意,我并不是要实现“全有或全无”的行为。我正在寻找一种保存点的工作方式。有没有办法用 NH 做到这一点(保存点)?
先感谢您。
菲利普