2009-10-14 30 views
1

我有一套集成測試在事務內部運行。 有時似乎NHibernate事務沒有正確回滾。我無法弄清楚是什麼原因造成的。NHibernate事務隨機不會回滾

這是基礎類的略微簡化的概述,這些集成測試夾具與運行:

public class IntegrationTestFixture 
{ 
    private TransactionScope _transactionScope; 
    private ConnectionScope _connectionScope; 

    [TestFixtureSetUp] 
    public virtual void TestFixtureSetUp() 
    { 
     var session = NHibernateSessionManager.SessionFactory.OpenSession(); 
     CallSessionContext.Bind(session); 
     _connectionScope = new ConnectionScope(); 
     _transactionScope = new TransactionScope(); 
    } 

    [TestFixtureTearDown] 
    public virtual void TestFixtureTearDown() 
    { 
     _transactionScope.Dispose(); 
     _connectionScope.Dispose(); 
     var session = CurrentSessionContext.Unbind(SessionFactory); 
     session.Close(); 
     session.Dispose(); 
    } 
} 

一個調用的commit方法永言的TransactionScope,所以怎麼可能是數據還是結束在數據庫中?

更新我從來沒有真正理解NHibernate處理事務的方式,但我發現在事務內調用Session.Flush()有時會導致數據保留在數據庫中,即使事務被滾動背部。我不確定你爲什麼不能打電話給Flush,但後來回滾。這是一個遺憾,因爲在集成測試期間,您希望能夠訪問數據庫,並且刷新是有時執行此操作的唯一方法。

回答

3

我在使用聽起來類似的身份生成器時遇到了問題。簡而言之,當使用身份生成器保存對象時,必須寫入數據庫才能獲取身份值,並且可以在事務外執行此操作。

Ayende對此有一個blog post

+0

現貨,解決了我遇到的問題。我最終實現了HiLo生成器。 – Faisal 2012-08-26 05:47:37

+0

如果這是問題,則表示您正在調用session.Save()或NH事務外的類似語句。如果您確實已經定義了事務,則NH將永遠不會在活動事務之外插入對象。但是,你的代碼只顯示TransactionScope,而不是NH事務,這可能會有問題。 – 2012-11-04 11:39:15