2011-09-20 71 views
0

你知道,为了实现在web应用中我们经常创造的Application_BeginRequest会话和Application_EndRequest全球事件处理程序关闭它的session-per-Web的请求。然后,每次我们访问数据库时,都会通过GetCurrentSession获取当前会话,而不是通过OpenSession打开新会话。我可以同时使用session-per-web-request和TransactionScope吗?

那么,有没有机会在web应用程序同时使用的session-per-Web的请求和TransactionScope的?据NHibernate的3.0食谱(第117页),它说,会议已被释放后应该发生在调用TransactionScope.Complete。令人惊讶的是不说的这种情况虽然两者的session-per-Web的请求和使用的TransactionScope在同一章中讨论的任何单词。

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

    scope.Complete(); 
} 
+0

是否有充分的理由使用TransactionScope而不是NHibernate Transaction? –

+1

TransactionScope不会取代NHibernate Transaction,它会封装事务。 –

回答

0

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

如果是这样的话,只需要创建和的Application_BeginRequest/Application_EndRequest完成()你的TransactionScope,就像你正在做的会话。

+0

我不认为每个请求需要的TransactionScope,即使在这种情况下,我更喜欢它打开晚,因为我们经常与交易做到早关闭。我们也不会为每个请求通过session-per-web-request启动一次转换,我们只是保持一个开放的Session。 –

相关问题