我可以同时使用session-per-web-request和TransactionScope吗?

时间:2011-09-20 08:19:24

标签: nhibernate transactions transactionscope

您知道,要在Web应用程序中实现基于Web的会话请求,我们通常会在Application_BeginRequest中创建一个会话,并在Application_EndRequest全局事件处理程序中将其关闭。然后每次我们访问数据库时,我们都会通过GetCurrentSession获取当前会话,而不是通过OpenSession打开一个新会话。

那么有没有机会在Web应用程序中同时使用session-per-web-request和TransactionScope?根据NHibernate 3.0 Cookbook(第117页),它表示对TransactionScope.Complete的调用应在会话处理完毕后进行。令人惊讶的是,尽管在同一章节中讨论了每个网络会话请求和使用TransactionScope,但它没有说明这种情况。

using (var scope = new TransactionScope())
{
  using (var session = sessionFactory.OpenSession())
  using (var tx = session.BeginTransaction())
  {
     // do something here
  }

  scope.Complete();
}

1 个答案:

答案 0 :(得分:0)

我假设您在每个请求(可能是不同的数据库)中打开了多个会话/事务,这是使用TransactionScope的唯一理由。

如果是这种情况,只需在Application_BeginRequest / Application_EndRequest中创建和完成()您的TransactionScope,就像您为会话所做的那样。