Session-in-view and TransactionScope

3
我们有一个使用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();
  }
}

然而,我们现在遇到了许多与数据库连接相关的崩溃情况。一些研究给出了两个建议:
  • 在事务范围内使用NHibernate事务
  • 在事务范围内创建会话
然而,我们对这些建议有两个问题:
  1. NHibernate难道不会自动加入TransactionScope吗?为什么我们需要为NHibernate显式地创建一个事务?
  2. 如果我们必须在TransactionScope中创建我们的会话,那么如何将其与Session-in-view模式相结合?
2个回答

4
  • 必须使用NH事务(session.BeginTransaction())
  • NH事务将自动加入TransactionScope
  • 您不必在TransactionScope中创建您的会话。

你能告诉我为什么吗?我找到的所有示例都是在TransactionScope内创建会话。 - Lodewijk
这就是它的工作方式(称其为实现细节)。我不知道你在哪里看到了那些例子(链接?),但如果它们创建会话而不是NH事务,则是错误的。 - Diego Mijelshon

0

看一下ncommon框架,它演示了使用NHibernate和TransactionScope的方法,使用UnitOfWorkScope的概念;这可能是你正在寻找的指导。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接