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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Sharp Architecture中使用NHibernate处理嵌套事务相关的知识,希望对你有一定的参考价值。

我想知道如何处理嵌套事务,例如在一个开始和提交之间,我有另一个开始和提交。我问你的原因是因为在我的ApplicationServices项目中我有依赖于其他服务的服务。父服务的方法开始一个事务,并且根据某些逻辑,它可能必须调用依赖子服务的一个方法,这些方法又执行开始和提交。 Child服务方法也可以直接从控制器中独立使用,因此我必须在子服务中使用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被回滚时,行为会是什么?

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

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

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

谢谢Nabeel

答案

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

另一答案

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

另一答案

您是否尝试过Sharp-Architecture-Contrib项目中的UnitOfWork属性?

http://github.com/codai/Sharp-Architecture-Contrib

http://tomcabanski.spaces.live.com/blog/cns!E0D3617496209F45!220.entry

http://wiki.sharparchitecture.net/ContribConfiguration.ashx

http://wiki.sharparchitecture.net/ContribUnitOfWork.ashx

以上是关于在Sharp Architecture中使用NHibernate处理嵌套事务的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 中使用Sharp压缩图像

在 webpack 中使用 node-loader 安装“sharp”模块出现问题

如何使用 taglib-sharp?

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

taglib-sharp 中是不是有与 Label/Publisher 等效的字段?