TransactionScope и ошибка: ORA-02049 - PullRequest
       30

TransactionScope и ошибка: ORA-02049

4 голосов
/ 26 октября 2009

У меня есть следующая процедура:

For j = 1 To NumItems
    dbValueLookup.Load(j)
    Using scope As New TransactionScope()
        For i = firstIndex To lastIndex

            'dbValueLookup is basically just a Dictionary of items already in the DB
            If dbValueLookup.ContainsKey(i) Then
                'updateData is a subroutine that updates this row with new data
                updateData(j,i)
                rowsUpdated = rowsUpdated + 1
                dbValueLookup.Remove(i)
            Else
                'updateData is a subroutine that adds a new row to DB
                addData(j,i)
                rowsAdded = rowsAdded + 1
            End If
        Next

        If dbValueLookup.Count = 0 Then
            'This commits the transaction - records will be updated when End Using is reached
            scope.Complete()
            If rowsAdded + rowsUpdated > 0 Then
                ShowMessage("Records Updated: " + rowsUpdated.ToString() + " Records Added: " + rowsAdded.ToString())
            End If

        Else
            'We are left with data from the database that was not updated.  This is a problem, so we don't "Complete" the scope.
            'This will result in a rollback.
            ShowWarningMessage("Incomplete Data for " + i.ToString())
        End If
    End Using
Next

Выполнение этого с нашей производственной и тестовой базой данных Oracle 11g спорадически (или, если есть шаблон, я его еще не нашел), генерирует ошибку Oracle: ORA-02049: время ожидания: распределенная транзакция ожидает блокировки

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

Есть идеи, что может быть причиной этой ошибки?

Заранее спасибо.

1 Ответ

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

Похоже, у вас должно быть две транзакции, конкурирующие за блокировку строки.

Просто мозговая атака здесь, но если dbValueLookup.Count = 0, то вы позвоните addData (звучит так, как будто это INSERT?), Но вы не будете звонить scope.Complete(), чтобы совершить транзакцию.

Я не уверен, будет ли End Using всегда совершать транзакцию или нет.

Вам действительно нужно создавать TransactionScope на каждой итерации цикла? Почему бы не создать одну транзакцию, сделать все свои обновления / вставки, а затем зафиксировать один раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...