2011-09-20 62 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。 –

相關問題