Linq to SQL Transaction Вставьте, затем выберите действительно очень медленно - PullRequest
0 голосов
/ 25 мая 2011

Я разрабатываю часть системы, которая в основном переносит данные из одного набора таблиц в другой набор.Все работает отлично, но я решил использовать транзакции вместо того, чтобы просто потерпеть неудачу на частично завершенных вещах.(То есть, если возникает какое-то исключение, я хочу выполнить откат вместо частичной миграции данных.)

У меня есть служба (в 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?).

1 Ответ

0 голосов
/ 18 июня 2011

Я выяснил, что если у вас есть контекст данных, использующий транзакцию, любой другой контекст данных, по-видимому, не сможет выбрать другой контекст того же типа.

В итоге я исправил это, используя один и тот же контекст для каждого выбора / обновления / удаления во время транзакции.

...