2009-10-14 31 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