【发布时间】:2011-02-09 20:01:13
【问题描述】:
我正在尝试使用 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 中做到这一点(保存点)?
提前谢谢你。
菲利普
【问题讨论】:
-
这样使用嵌套事务有什么实际优势?
-
Paco,我们的想法是我们可以拥有带有与之关联的跨行为行为的“容器”。这是我们正在构建的集成框架,我们可以有不同的块,它们的事务行为不同:实体 A 和 B 插入在一起,任何错误都会导致整个回滚,但实体 C 是同一集成的第三部分,即使关于错误。场景有点复杂,但我希望这个描述希望你理解。我期待分析人员确认我的理解,并将尝试找出解决这些问题的其他方法。 Tnks。
标签: nhibernate transactions nested-transactions savepoints