【发布时间】:2009-12-30 18:36:15
【问题描述】:
我创建了一个集成测试来验证存储库是否正确处理并发。如果我在没有 TransactionScope 的情况下运行测试,一切都按预期工作,但是如果我将测试包装在 TransactionScope 中,我会收到一个错误,提示突然需要分布式事务(这让我相信还有第二个事务正在创建)。这是测试:
[Test]
public void Commit_ItemToCommitContainsStaleData_ThrowsStaleObjectStateException()
{
using (new TransactionScope())
{
// arrange
RootUnitOfWorkFactory factory = CreateUnitOfWorkFactory();
const int Id = 1;
WorkItemRepository firstRepository = new WorkItemRepository(factory);
WorkItem itemToChange = WorkItem.Create(Id);
firstRepository.Commit(itemToChange);
WorkItemRepository secondRepository = new WorkItemRepository(factory);
WorkItem copyOfItemToChange = secondRepository.Get(Id);
// act
copyOfItemToChange.ChangeDescription("A");
secondRepository.Commit(copyOfItemToChange);
itemToChange.ChangeDescription("B");
// assert
Assert.Throws<StaleObjectStateException>(() => firstRepository.Commit(itemToChange));
}
}
这是错误堆栈的底部:
失败:NHibernate.Exceptions.GenericADOException:无法加载实体:[TfsTimeMachine.Domain.WorkItem#1][SQL:SELECT workitem0_.Id as Id1_0_,workitem0_.LastChanged as LastChan2_1_0_,workitem0_.Description as Descript3_1_0_ FROM [WorkItem ] workitem0_ WHERE workitem0_.Id=?] ----> System.Data.SqlClient.SqlException:服务器“ADM4200\SQLEXPRESS”上的 MSDTC 不可用。 在 NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)。
我正在运行 NUnit 2.1,所以有人可以告诉我,如果在查询数据之前没有 session.BeginTransaction(),Nhibernate 是否会创建隐式事务,而不管在 TransactionScope 中运行的会话如何?
【问题讨论】:
标签: nhibernate