2010-06-12 77 views
2

我剛剛開始學習NHibernate 2天前,我正在尋找一個基於教程編寫的CRUD方法。 我的插入方法是:NHibernate - ITransaction.Commit真的有必要嗎?

 using (ISession session = Contexto.OpenSession()) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.Save(noticia); 
      transaction.Commit(); 
      session.Close(); 
     } 

的 「Contexto」 完整的代碼是在這裏:http://codepaste.net/mrnoo5

我的問題是:我真的需要使用ITransaction事務= session.BeginTransaction()器transaction.commit();

我在問這是因爲我測試過沒有這兩行代碼的情況下運行web應用程序,並且我已經成功插入新記錄。

如果可能的話,有人可以解釋我的Itransaction的目的和方法提交?在您的交易

感謝

回答

3

ITransaction事務= session.BeginTransaction()是沒有必要的。

但想象一下,會話引發異常時會發生什麼?你將如何找回對數據庫的更改?

從Nhib以下是引用...

一個典型的事務應該用下面的習慣:如果ISession的拋出異常

ISession sess = factory.OpenSession(); 
ITransaction tx; 
try 
{ 
    tx = sess.BeginTransaction(); //do some work ... 
    tx.Commit(); 
} 
catch (Exception e) 
{ 
    if (tx != null) 
    tx.Rollback(); 
    throw; 
} 
finally 
{ 
    sess.Close(); 
} 

,該交易必須回滾 和會話丟棄。異常發生後,ISession的內部狀態可能不是 與數據庫一致。 NHibernate。ISessionFactory

+0

我會嘗試閱讀更多關於異常以及如何回滾轉換並丟棄會話的信息。 來自葡萄牙的感謝;) – 2010-06-12 20:53:22

+3

總是應該使用。 – 2010-06-12 23:10:58

1

那麼你調用commit(),它保存所有對數據庫的修改。

我真的需要使用ITransaction transaction = session.BeginTransaction()和transaction.Commit();?

是的,它被認爲是使用事務處理即使是簡單讀取也是很好的做法。

已測試運行的Web應用程序沒有這兩行,我已經成功插入新的記錄。

這是因爲會話將在使用語句結束時處理更改。

反正這是我怎麼會正確保存:當你發現通過試驗

using (ISession session = Contexto.OpenSession()) 
{ 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     try 
     { 
      session.Save(noticia); 
      transaction.Commit(); 
     } 
     catch(HibernateException) 
     { 
      transaction.Rollback(); 
      throw; 
     } 
    } 
} 
+0

+1,如果您有trans.commit,但沒有sess.Close會發生什麼?任何想法 – VoodooChild 2010-06-12 20:51:48

+0

@VoodooChild:當你提交事務時,會話中的所有更改都將被提交給數據庫。即使沒有session.Close() – 2010-06-12 20:54:37

+0

@Yassir,你的catch中的代碼是多餘的。如果'using'塊沒有提交,事務就會回滾。 – 2010-06-12 23:12:24

9

這是正確的通用NHibernate的使用模式:

using (ISession session = sessionFactory.OpenSession()) 
using (ITransaction transaction = session.BeginTransaction()) 
{ 
    //Do the work here 
    transaction.Commit(); 
} 

所有這一切都需要確保一切正常(除非你使用額外的基礎設施)

關閉會話或做任何事情除了提交之外的事務是多餘的,因爲會話和事務的方法Dispose負責清理,如果存在錯誤則包括回滾。

重要的是要注意比做什麼在會話發生異常後會導致意外行爲,這是限制塊內顯式異常處理的另一個原因。

+0

+1,謝謝......我會盡快看看。 – VoodooChild 2010-06-13 16:14:34

相關問題