NHibernate事务随机不回滚

时间:2009-10-14 03:24:35

标签: nhibernate transactions

我有一套在事务内部运行的集成测试。 有时似乎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();
    }
}

永远不会调用TransactionScope的提交方法,因此数据如何仍然可以在数据库中结束?

更新我从未真正理解NHibernate处理事务的方式,但我发现在事务中调用Session.Flush()有时会导致数据保留在数据库中,即使然后回滚事务。我不知道为什么你不能打电话给Flush,但后来回滚。这是一个遗憾,因为在集成测试期间,您希望能够访问数据库,并且有时这是执行此操作的唯一方法。

1 个答案:

答案 0 :(得分:3)

我在使用听起来相似的Identity生成器时遇到了问题。简而言之,当使用标识生成器保存对象时,它必须写入数据库以获取标识值,并且可以在事务外执行此操作。

Ayende对此有一个blog post