NHibernate事务不会随机回滚

NHibernate事务不会随机回滚,nhibernate,transactions,Nhibernate,Transactions,我有一套在事务内部运行的集成测试。 有时,NHibernate事务似乎没有被正确回滚。我不知道是什么原因造成的 下面是这些集成测试装置运行时使用的基类的一个稍微简化的概述: public class IntegrationTestFixture { private TransactionScope _transactionScope; private ConnectionScope _connectionScope; [TestFixtureSetUp] pub

我有一套在事务内部运行的集成测试。 有时,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()有时会导致数据保留在数据库中,即使事务随后被回滚。我不知道你为什么不能打电话给同花顺,然后再打回去。这是一个遗憾,因为在集成测试期间,您希望能够访问数据库并刷新,这有时是唯一的方法。

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


Ayende对此有自己的看法。

当场解决了我的问题。我最终实现了一个HiLo生成器。如果是这个问题,则表明您正在NH事务之外调用session.Save()或类似的函数。NH永远不会在活动事务之外插入对象,前提是您确实定义了事务。但是您的代码只显示TransactionScope,而不是NH事务,这可能会有问题。