Я создал интеграционный тест, чтобы проверить, что репозиторий корректно обрабатывает параллелизм. Если я проведу тест без TransactionScope, все будет работать так, как ожидалось, но если я завершу тест в TransactionScope, я получу ошибку, предполагающую, что внезапная потребность в распределенных транзакциях (что заставило меня поверить, что есть вторая транзакция создается). Вот тест:ли nhibernate создает неявные транзакции в 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: MSDTC на сервере 'ADM4200 \ SQLEXPRESS 'недоступен. at NHibernate.Loader.Loader.LoadEntity (сеанс ISessionImplementor, идентификатор объекта, идентификатор ITypeType, объект optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister).
Я запускаю NUnit 2.1, так может кто-то сказать мне, если Nhibernate создает неявные транзакции, если перед запросом данных нет сеанса.BeginTransaction(), независимо от сеанса, выполняющегося в TransactionScope?
Да, вы правы. Таким образом, ответ отрицательный, Nhibernate не создает неявных транзакций. Это не удается, потому что два разных соединения ADO.net присоединяются к одной и той же транзакции, поэтому запрос на получение во втором репозитории вызывает ошибку. Теперь мне просто нужно контролировать сеансовое соединение внутри транзакции (в моем случае не должно быть необходимости в dist trans), чтобы заставить это работать – Marius