Я разрабатываю часть системы, которая в основном переносит данные из одного набора таблиц в другой набор.Все работает отлично, но я решил использовать транзакции вместо того, чтобы просто потерпеть неудачу на частично завершенных вещах.(То есть, если возникает какое-то исключение, я хочу выполнить откат вместо частичной миграции данных.)
У меня есть служба (в 3-уровневой архитектуре, а не веб), которая начинает транзакцию с даннымиуровень доступа.Контекст данных совместно используется в классе доступа к данным, который содержит много методов.Эти методы используют различные методы LINQ-to-SQL для обновления / вставки / удаления.Все LINQ-to-SQL "selects" находятся в CompiledQueries.
Метод «BeginTransaction» запускает транзакцию следующим образом:
Public Sub BeginTransaction() Implements ITransactionalQueriesBase.BeginTransaction
Me.Context.Connection.Open()
Me.Context.Transaction = Context.Connection.BeginTransaction()
IsInTransaction = True
End Sub
В основном я написал тест, который запускает транзакцию, вставляет ее в таблицу, а затем пытается извлечь значениеэто было только что вставлено, все во время транзакции.Я сделал это, потому что хотел заявить, что метод вставки фактически пытается вставить.Затем во время теста я выполняю откат, затем проверяю, чтобы убедиться, что вновь добавленное значение фактически не зафиксировано в таблице.Тест выглядит примерно так:
<TestMethod()>
Public Sub FacilityService_Can_Rollback_A_Transaction()
faciService.BeginTransaction()
Dim devApp = UnitTestHelper.CreateDevelopmentApplication(devService.GetDevelopmentType("NEWFACI").ID, 1, 1, 1, 1)
Dim devInsertRes = devService.InsertDevelopmentApplication(devApp)
Assert.IsTrue(devInsertRes.ReturnValue > 0)
For Each dir1 In devInsertRes.Messages
Assert.Fail(dir1)
Next
Dim migrationResult = faciService.ProcessNewFacilityDevelopment(devInsertRes.ReturnValue)
Assert.IsTrue(migrationResult.ReturnValue.InsertResult)
Dim faciRetrieval1 = faciService.GetFacilityByID(migrationResult.ReturnValue.FacilityID)
Assert.IsNotNull(faciRetrieval1.ReturnValue)
faciService.Rollback()
Dim faciRetrieval2 = faciService.GetFacilityByID(migrationResult.ReturnValue.FacilityID)
Assert.IsNull(faciRetrieval2.ReturnValue)
End Sub
Итак, к моей проблеме ...
Когда тест переходит к шагу "faciRetrieval1", он остается там в течение 30-60 секунд.прежде чем двигаться дальше.Я не уверен, почему это происходит.Если я выполняю те же запросы в транзакции внутри SSMS, это происходит мгновенно.У кого-нибудь есть какие-либо идеи?База данных представляет собой SQL Server 2008 с пакетом обновления 1 (R2?).