代码之家  ›  专栏  ›  技术社区  ›  tQuarella

当使用NHibernate和每个请求一个工作单元时,在什么情况下对每个请求使用多个事务是有益的?

  •  3
  • tQuarella  · 技术社区  · 14 年前

    在我的web应用程序中,在BeginRequest处理程序中创建了一个会话。对该会话执行所有数据库操作。在EndRequest处理程序中,会话用于创建一个事务,然后提交该事务。之后,会话被释放。这将对会话执行的所有数据库操作包装到单个事务中。

    2 回复  |  直到 14 年前
        1
  •  1
  •   cbp    14 年前

    当用户访问某个页面时,您希望将各种内容记录到数据库中—页面命中等。这可以在同一会话中愉快地发生,但您希望页面跟踪被刷新到数据库中,即使随后发生错误也是如此。

    为了提高性能,您将希望尽可能短的时间内打开事务。在您的请求期间,您可能正在执行许多面向非数据库的操作,在此期间没有理由保持事务处于打开状态。

        2
  •  0
  •   Corey Coogan    14 年前

    我个人不喜欢这样做,原因很简单,就是错误处理。如果你的事务。提交你的主要行动/请求/诸如此类的失败,你对发生的事情没有背景。然后,您将把用户发送到一些蹩脚的错误页或类似的页面。如果您正在执行web服务,其中可能返回一个指示内部错误或类似错误的结果代码,则这一点尤其正确。

    我发现每个调用通常有一个业务事务,因此,我让我的应用程序服务管理事务,只让BeingRequest处理打开会话和EndRequest来刷新会话并进行处理。

    我在EndRequest上刷新的原因是为了处理可能发生在事务边界之外的任何DB活动,但是,如果您有一个跨所有站点/服务处理这些活动的组件,情况就更糟了。