2009-12-18 76 views
0

我在使用nhibernate中的存儲庫模式。 在一個asp.net mvc應用程序中。 我有一個HTTP模塊,即:如何在單個請求中提交併啓動新的事務?

beginRequest it calls session.beginTransaction(); 
EndRequest it calls session.Transaction.Commit(); 

這是罰款的95%的時間。

我有,我需要做一個請求以下的情況下:

List<User> users = factory.getUsers(); 

// update users 

// commit transaction 

// load users from the db again 

我是否應該打電話:

factory.Session.Transaction.Commit(); 
factory.Session.BeginTransaction(); 

我知道這是對使用的原因之一存儲庫模式,並在HttpModule會話開始/結束,但無論如何,這就是我是如何做到這一點:)

什麼是我的o ptions?

Uptate 所以基本上我現在有:

一個頁面請求將是這樣的:

BeginRequest: Session.BeginTransaction(); 

userlist.aspx: 
       // code to fetch users from the db 
       // update users 
       Session.Transaction.Commit(); 
       Session.BeginTransaction(); 
       // code to fetch recently commited users form db 

EndRequest: Session.Transaction.Commit(); 

上面似乎並正確嗎?

我想我應該在調用commit之前先檢查一下是否有當前事務並重新開始?

回答

1

你有邏輯

List<User> users = factory.getUsers(); 

// update users 

load users 

的兩件,你想那些在單獨的交易。所以你添加適當的開始和提交。它有效,問題在哪裏?有

在 的HttpModule會話開始/結束,但無論如何,這就是我 我做吧:)有什麼選擇?

討論的重點是否讓Session開始在HttpModule中結束?那麼,你的選擇是不做的!你有一個邏輯塊(在這裏非常簡單的邏輯),可能它是可重用的,所以把它移到它自己的類中。你認爲這是最好有

客戶端代碼:

useSomeLogic() // bzzzt forgot to start session 

    startSession() 
    useSomeLogic() // ok thank you, I can work, but please remember to commit 
    commit() 

或者

useSomeLogic() // just fine, I'll start the session and do you work for you and commit 

我喜歡漂亮包裝的可重複使用的代碼,這就是爲什麼我重構的東西遠離特定的傳輸模塊。

相關問題