姬長信(Redy)

.net-会话中的视图和TransactionScope


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

>我们需要分布式事务,因为我们既要写入数据库又要写入队列.
>因为这是一个Web应用程序,所以我们使用了推荐的会话期间观看模式.我们有一个HTTPModule,它在BeginRequest事件上打开NHibernate会话,并在EndRequest上关闭它.
>在请求流程中,我们有几个单独的时刻需要进行事务处理.为此,我们使用TransactionScope.

因此,基本上,这是什么(伪代码):

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();
  }
}

但是,我们现在陷入一种情况,其中看到许多与数据库连接有关的崩溃.一些研究给我们两个建议:

>在您的transactionscope中使用NHibernate事务
>在transactionscope中创建会话

但是,关于这些建议,我们有两个问题:

> NHibernate不会自动将自己加入TransactionScope.为什么我们需要为NHibernate显式创建一个事务?
>如果必须在TransactionScope中创建会话,我们如何将其与会话中的视图模式结合?