Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 视图中的会话和TransactionScope_.net_Asp.net_Nhibernate_Transactions - Fatal编程技术网

.net 视图中的会话和TransactionScope

.net 视图中的会话和TransactionScope,.net,asp.net,nhibernate,transactions,.net,Asp.net,Nhibernate,Transactions,我们有一个使用NHibernate的asp.net webforms应用程序。以下是一些细节: 我们需要分布式事务,因为我们写入数据库和队列 因为这是一个web应用程序,所以我们使用“视图中的推荐会话”模式。我们有一个HTTPModule,它在BeginRequest事件上打开NHibernate会话,在EndRequest事件上关闭它 在请求流中,我们有几个单独的时刻需要进行事务性工作。为此,我们使用TransactionScope 所以基本上,发生的是这样的(伪代码): 然而,我们现在遇

我们有一个使用NHibernate的asp.net webforms应用程序。以下是一些细节:

  • 我们需要分布式事务,因为我们写入数据库和队列
  • 因为这是一个web应用程序,所以我们使用“视图中的推荐会话”模式。我们有一个HTTPModule,它在BeginRequest事件上打开NHibernate会话,在EndRequest事件上关闭它
  • 在请求流中,我们有几个单独的时刻需要进行事务性工作。为此,我们使用TransactionScope
所以基本上,发生的是这样的(伪代码):

然而,我们现在遇到了这样一种情况:我们看到很多与数据库连接相关的崩溃。一些研究给了我们两个建议:

  • 在transactionscope中使用NHibernate事务
  • 在transactionscope中创建会话
然而,我们对这些建议有两个问题:

  • NHibernate不会自动将自己登记到TransactionScope中。为什么我们需要显式地为NHibernate创建事务
  • 如果我们必须在TransactionScope中创建会话,我们如何将其与视图中的会话模式相结合
    • 您必须使用NH事务(
      session.BeginTransaction()
    • NH事务将自动登记到TransactionScope中
    • 您不必在TransactionScope中创建会话

    看看,它演示了使用
    UnitOfWorkScope的概念将NHibernate与TransactionScope结合使用的方法;这可能是您正在寻找的指南。

    您能告诉我为什么吗?我找到的所有示例都是在TransactionScope中创建会话的。这就是它的工作原理(称之为实现细节)。我不知道您在哪里见过这些示例(link?),但如果它们创建会话而不是NH事务,那么它们就错了。
    using(var session = sessionFactory.CreateSession()){
      using(var tx1 = new TransactionScope(){
        //work work work
        tx1.Complete();
      }
    
      //other work
    
      using(var tx2 = new TransactionScope(){
        //work work work
        tx2.Complete();
      }
    }