【发布时间】: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