2013-05-31 35 views
6

我的問題是有關下面是一個問題transaction.Begin()?或者只是多餘?NHibernate的session.BeginTransaction()與transaction.Begin()使用NHibernate的交易</p> <p>的

using (var transaction = session.BeginTransaction()) 
{ 
    transaction.Begin(); 
    action(); 
    transaction.Commit(); 
} 
+1

收藏此:http://ayende.com/blog/3775/nh-prof-alerts-use-of-implicit-transactions-is-discouraged – Freelancer

+0

閱讀Ayende是一件好事......但在這種情況下不回答我的問題 – SteveM

回答

8

檢查信息來源後,transaction.Begin()實際上是多餘的 - 一個無害的無操作。

link to source

3

beginTransaction,因爲它規定開始,從另一方面

session.Transaction交易,

將返回當前活動的事務,如果空將創建一個。

NHibernate會話跟蹤當前活動(未提交或回滾)事務。

如果您在通話過程中會話的續航時間尚未創建ISession.Transaction時沒有交易至今還沒有 ,該會議將 在那個時間點上創建一個新的交易對象,但不會開始 它。當您撥打ISession.BeginTransaction時,會話將看到 ,如果它們已經是之前創建的交易對象 但尚未完成。如果是這樣,它將返回這個事務對象。 如果不是,它將創建一個新的事務對象,開始它並存儲一個 對這個新對象的引用。

在事務完成時,事務對象通知它已完成的對象所屬的會話 ,在會話 上,會話將釋放其對事務對象的引用。之後任何對 ISession.TransactionISession.BeginTransaction的調用都將導致創建新的事務對象 。

NHibernate不支持重複使用一個事務中的事務對象超過 (這種行爲可能與Hibernate不同,其中 似乎支持重用事務對象)。

請參閱this文件。

+0

有點令人困惑...所以beginTransaction只會創建一個新的事務,如果在會話中沒有當前事務,否則返回現有的事務?那麼後面的transaction.Begin()在這種情況下會有什麼影響?這是不是操作? – SteveM