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