【问题标题】:Can I use both session-per-web-request and TransactionScope?我可以同时使用 session-per-web-request 和 TransactionScope 吗?
【发布时间】:2023-04-07 05:56:01
【问题描述】:

您知道,为了在 Web 应用程序中实现 session-per-web-request,我们经常在 Application_BeginRequest 中创建一个会话,并在 Application_EndRequest 全局事件处理程序中关闭它。然后每次访问数据库时,我们通过 GetCurrentSession 获取当前会话,而不是通过 OpenSession 打开一个新会话。

那么有没有机会在 web 应用程序中同时使用 session-per-web-request 和 TransactionScope 呢?根据 NHibernate 3.0 Cookbook(第 117 页),它说对 TransactionScope.Complete 的调用应该在会话被释放后发生。令人惊讶的是,它没有说明这种情况,尽管 session-per-web-request 和使用 TransactionScope 都在同一章中讨论。

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

  scope.Complete();
}

【问题讨论】:

  • 是否有充分的理由使用 TransactionScope 而不是 NHibernate Transaction?
  • TransactionScope 不会替换 NHibernate Transaction,它会包装事务。

标签: nhibernate transactions transactionscope


【解决方案1】:

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

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

【讨论】:

  • 我不认为每个请求都需要 TransactionScope,即使在这种情况下,我更喜欢它像我们经常使用事务一样打开和关闭。我们也不会使用 session-per-web-request 为每个请求启动一个事务,我们只是保持一个打开的 Session。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多