我正在尝试使用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做到这一点(保存点)?

    谢谢。

    Filipe

有帮助吗?

解决方案

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

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

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

    重要的一点是,此UoW操纵的“事务”不是直接进行NH(ADO.NET)事务。我们已经创建了事务的抽象,因此,如果我们的事务可能被提交或回退,则操作代码会“投票”,但实际的操作只是根据所选的错误策略在所有操作的最后进行。

    我们知道这种用法不是很常见,仅适用于特定方案(在我们的情况下是具有批处理功能的集成方案),所以现在我将发布代码。如果有人认为此实现可以提供帮助,请给我发送一条消息,我将很乐意分享代码。

    此致

    Filipe

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top