【问题标题】:Dealing nested transactions using NHibernate in Sharp Architecture在 Sharp Architecture 中使用 NHibernate 处理嵌套事务
【发布时间】:2018-03-02 00:18:40
【问题描述】:

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

所以简而言之,基本上我最终会得到这样的东西

   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 已回滚?

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

-如果我不想让子事务成为父事务的一部分 交易。 - 如何判断一个事务是否已经在运行 创建子事务

或者如果这个问题有另一个优雅的解决方案?

谢谢 纳比尔

【问题讨论】:

    标签: nhibernate s#arp-architecture


    【解决方案1】:

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

    【讨论】:

    • 是的,两个存储库的 DBContect 是相同的,并且在 NHibernate Profiler 中进行分析后,事实证明 nhibernate 不会为内部存储库开始新事务。是的,将交易分成两种方法,这正是我目前正在做的事情。但我认为可能有更好的方法来做到这一点。我过去使用过 TransactionScope,所以我想尝试一下,因为我在我的应用程序中使用单个 SQL 2005 数据库。
    • 我发现另一个关于 SO 的帖子也很有用。 stackoverflow.com/questions/646318/…
    【解决方案2】:

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

    【讨论】:

    • 还有一个winform客户端。而且我正在考虑将事务管理代码保留在我的 ApplicationServices 项目而不是 Controllers 项目中,这样我就不必再次在 Winform 中管理事务操作代码了。
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多