Session-in-view和TransactionScope

时间:2010-12-21 14:00:19

标签: .net asp.net nhibernate transactions

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

  • 我们需要分布式事务,因为我们写入数据库以及队列。
  • 因为这是一个Web应用程序,我们使用推荐的Session-in-view模式。我们有一个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();
  }
}

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

  • 在transactioncope中使用NHibernate事务
  • 在transactioncope中创建会话

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

  1. NHibernate不会自动登记到TransactionScope中。为什么我们需要为NHibernate明确创建一个事务?
  2. 如果我们必须在TransactionScope中创建Session,我们如何将它与Session-in-view模式结合起来?

2 个答案:

答案 0 :(得分:4)

  • 必须使用NH交易(session.BeginTransaction()
  • NH 交易 将自动登记在TransactionScope中
  • 您不必在TransactionScope中创建会话。

答案 1 :(得分:0)

看一下ncommon framework,它演示了一个使用UnitOfWorkScope概念将NHibernate与TransactionScope一起使用的方法;这可能是您正在寻找的指导。