实现NHibernate嵌套事务行为

时间:2010-04-19 19:05:04

标签: nhibernate transactions nested-transactions savepoints

我正在尝试使用NHibernate的事务控制和FlushMode选项来实现某种嵌套事务行为,但是在阅读太多之后事情变得有点混乱,所以我在下面列出的事实的任何确认都非常有用。< / p>

我想要的是打开一个在小事务中分裂的大事务。想象一下以下场景:

  • TX1打开一个TX并插入一个人的记录;
  • TX2打开TX并将此人的姓名更新为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有没有办法(保存点)?

提前谢谢。

菲利普

2 个答案:

答案 0 :(得分:7)

只是不要永远打开这个问题,我会发布我们采用的解决方案。

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

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

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

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

此致

菲利普

答案 1 :(得分:1)

NHibernate不支持嵌套事务。每个ISession最多只能有一个活动事务。我不确定你是什么;重新尝试完成,因为你的示例场景对我没有意义。插入后提交事务1将产生相同的效果。