【问题标题】:Achieving NHibernate Nested Transactions Behavior实现 NHibernate 嵌套事务行为
【发布时间】: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


【解决方案1】:

为了不让这个问题永远悬而未决,我将发布我们采用的解决方案。

我们有一个像容器一样的工作单元来管理嵌套事务行为。根据我们想要的治疗类型,它会创建(或不创建)新会话。举例:

  • 出错时继续:如果我们希望即使其他事务发生错误,UoW 容器也会为每个“事务”使用不同的会话,并在其工作结束时刷新每个 tx;
  • 错误回滚:如果我们希望在会话回滚时(由于错误或业务回滚)所有其他事务都回滚,UoW 容器对所有嵌套事务使用相同的会话并回滚所有结束。

重要的是要说这个 UoW 操作的“事务”不是直接的 NH (ADO.NET) 事务。我们创建了一个事务的抽象,因此如果我们的事务可能被提交或回滚,操作代码会“投票”,但真正的动作只是发生在一切结束时,基于所选的错误策略。

我们知道这种用法不是很常见,仅适用于特定场景(在我们的例子中,它是与批处理的集成场景),所以我现在将发布代码。如果有人认为这个实现可以提供帮助,请给我发消息,我很乐意分享代码。

问候,

菲利普

【讨论】:

    【解决方案2】:

    NHibernate 不支持嵌套事务。每个 ISession 最多可以有一个活动事务。我不确定您正在尝试完成什么,因为您的示例场景对我来说没有意义。在插入之后提交事务 1 将具有相同的效果。

    【讨论】:

    • Jamie,但根据业务问题,我可能想要回滚 TX 1,而我想要的行为是它会回滚所有执行的插入/更新。我对帕科的上述评论让人们对这种情况有了更广泛的了解。我会尝试另一种方法来解决这个问题。如果我找到其他方法,我会回复。
    • 也许您可以将每个容器隔离在其自己的工作单元 (ISession) 中,然后该工作单元可以拥有自己的事务。您可以使用 Lock 或 Merge 组合 ISession 以在事务中组合容器。
    • 杰米,我就是这样。我没有考虑过组合不同的会话(直到现在才需要),但它可能会适合将来的某些情况。无论如何,我们会将每个容器隔离在一个工作单元中,该工作单元提供嵌套功能,最终管理所有提交/回滚。在我们在这里进一步推进之后,我将发布最终解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多