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,但后来回滚。这是一个遗憾,因为在集成测试期间,您希望能够访问数据库,并且刷新是有时执行此操作的唯一方法。
现货,解决了我遇到的问题。我最终实现了HiLo生成器。 – Faisal 2012-08-26 05:47:37
如果这是问题,则表示您正在调用session.Save()或NH事务外的类似语句。如果您确实已经定义了事务,则NH将永远不会在活动事务之外插入对象。但是,你的代码只显示TransactionScope,而不是NH事务,这可能会有问题。 – 2012-11-04 11:39:15