您知道,要在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();
}
答案 0 :(得分:0)
我假设您在每个请求(可能是不同的数据库)中打开了多个会话/事务,这是使用TransactionScope的唯一理由。
如果是这种情况,只需在Application_BeginRequest / Application_EndRequest中创建和完成()您的TransactionScope,就像您为会话所做的那样。