在Sharp Architecture中使用NHibernate处理嵌套事务

时间:2010-06-22 21:34:14

标签: nhibernate s#arp-architecture

我想知道如何处理嵌套事务,例如之间 一开始和提交,我有另一个开始和提交。我的原因 问你是因为在我的ApplicationServices项目中 依赖于其他服务的服务。和父母的方法 服务开始一个事务,并根据一些逻辑,它可能 必须调用依赖子服务的方法之一,即 也反过来执行开始和提交。儿童服务方法是 也可以直接从控制器中独立使用, 因此我必须在子服务中使用begin和commit。

简而言之,基本上我最终会得到类似的东西

   using( Repository1.DbContext.BeginTransaction() )
   {
      try
      {
         .....
         .....
         using( Repository2.DbContext.BeginTransaction() )
         {
            try
            {
               .....
               .....
               Repository2.DbContext.CommitTransaction()
            }
            catch
            {
               Repository2.DbContext.RollBack();
               throw;
            }
        }
        Repository1.DbContext.CommitTransaction()
      }
      catch
      {
         Repository1.DbContext.RollBack();
         throw;
      }
   }

所以有嵌套的开始和提交。我想知道

- 当嵌套的Repository2获得时,行为是什么 已成功提交,但父Repository1已回滚?

如何在代码中控制此行为,例如

- 如果我不想让子事务成为父事务的一部分 交易。 - 如何弄清楚之前已经在运行的事务 创建子事务

或者是否有另一个优雅的解决方案来解决这个问题?

由于 纳贝尔

3 个答案:

答案 0 :(得分:3)

NHibernate不支持嵌套事务。 Repository1和Repository2的DbContext是否相同?如果是这种情况,那么他们可以参与同一交易。如果没有,您必须将事务拆分为两种方法或查看System.Transactions namespace

答案 1 :(得分:0)

如果您将事务边界放在控制器级别,那么我会说您不需要嵌套事务。

答案 2 :(得分:0)