Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 взаимоблокировка ресурсов  [new]
Lockpickup
Member

Откуда: Из фаллопиевых труб
Сообщений: 250
Всем привет!

Клиентская часть на ADODB, база данных - MS SQL 2008

Когда 2 пользователя параллельно работают с различными записями получаю ошибку -2147467259 "Транзакция (идентификатор процесса XXX) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно."
Ошибка вылезает на каком либо из UPDATE ил DELETE. Иногда ошибка появляется уже после SMART_CNN.cnn.CommitTrans, на стадии SELECT всяких разных результатов обсчета. (Что за хрень, сервер не успел завершить запрос, а мой код VBA побежал дальше???)

Создание соединения, объект SMART_CNN.cnn:
Public WithEvents cnn As ADODB.Connection
Private Sub Class_Initialize()
    Set Me.cnn = New ADODB.Connection
    Me.cnn.CursorLocation = adUseClient
    cnn.ConnectionTimeout = 0
    exec_timeout = SMART_EXEC_TIMEOUT
End Sub
Public Function CreateADOConnectionToDB(cnn_string As String) As Boolean
    
    On Error GoTo ErrHandler

    Me.cnn.Open cnn_string, SMART_SQL_USER, SMART_SQL_PASS, adConnectUnspecified
    CreateADOConnectionToDB = True
    Exit Function
    
ErrHandler:
    'BasicFunctions.RaiseError 514
    If (Err.Number = 3705) Then
        MsgBox Err.Description
        CreateADOConnectionToDB = False
        Exit Function
    End If
    BasicFunctions.DisplayError
End Function

Собственно работа с базой:
SMART_CNN.cnn.Execute "SET TRANSACTION ISOLATION LEVEL READ COMMITTED;", adExecuteNoRecords, dbFailOnError
transaction_level = SMART_CNN.cnn.BeginTrans 
'UPDATE 50 записей 
'DELETE ~2500 записей
'INSERT INTO ~2500 записей
'UPDATE 7500 записей
'редактирование 3-х рекордсетов с 2500 записей
SMART_CNN.cnn.CommitTrans
'SELECT всяких разных результатов обсчета

Если использовать SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, то никаких сообщений не выдается. Но в том случае если пользователи работают с одинаковыми записями, сервер берет данные того пользователя, который первым начал транзакцию, на изменения другого пользователя БД просто "забивает".
Подскажите как добиться именно такого поведения, но чтобы в случае работы 2-х или более пользователей с одинаковыми записями возникала ошибка блокировки ресурсов, а если 2-х или более или более пользователей работают с разными записями, то блокировки бы не возникало.
15 апр 16, 12:39    [19061428]     Ответить | Цитировать Сообщить модератору
 Re: взаимоблокировка ресурсов  [new]
iljy
Member

Откуда:
Сообщений: 8711
Lockpickup
Если использовать SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, то никаких сообщений не выдается. Но в том случае если пользователи работают с одинаковыми записями, сервер берет данные того пользователя, который первым начал транзакцию, на изменения другого пользователя БД просто "забивает".

Фигню вы какую-то говорите, SERIALIZABLE не может изменения терять. А по взаимоблокировкам - граф посмотрите.
15 апр 16, 13:10    [19061611]     Ответить | Цитировать Сообщить модератору
 Re: взаимоблокировка ресурсов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Lockpickup
сервер берет данные того пользователя, который первым начал транзакцию


Неверное наблюдение, изменения поступают в порядке FIFO.
SERIALIZABLE требуется для того, чтобы предотвратить изменения считанных данных в рамках транзакции. В результате Вы можете получить цепочки ожиданий других транзакций.
15 апр 16, 13:27    [19061718]     Ответить | Цитировать Сообщить модератору
 Re: взаимоблокировка ресурсов  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Lockpickup
Подскажите как добиться именно такого поведения, но чтобы в случае работы 2-х или более пользователей с одинаковыми записями возникала ошибка блокировки ресурсов, а если 2-х или более или более пользователей работают с разными записями, то блокировки бы не возникало.
Читайте про механизм оптимистических блокировок.
15 апр 16, 13:41    [19061846]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить