powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка DeadLock-ов в ADO
11 сообщений из 11, страница 1 из 1
Обработка DeadLock-ов в ADO
    #32727132
Stok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Процедура выполняет на MS SQL Server 2000 последовательность обновлений:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim CmdT As New ADODB.Command
   Set CmdT.ActiveConnection = "Provider=SQLOLEDB.1;User ID=..."
   CmdT.CommandType = adCmdText
   CmdT.CommandTimeout =  0 
     CmdT.CommandText = "Delete ...."
     CmdT.Execute
     CmdT.CommandText = "Insert ...."
     CmdT.Execute
     CmdT.CommandText = "Update ...."
     CmdT.Execute
     CmdT.CommandText = "EXEC [dbo].[My_SyncData] "
     CmdT.Execute
Пару раз в день в сети из 20 юзеров возникает спонтанный DeadLock:
Код: plaintext
1.
2.
3.
Run-time error  '-2147467259 (800004005)': 
Transaction (Process ID  253 ) was deadlocked on lock resources with 
another process and has been chosen as the deadlock victim. 
Rerun the transaction.
Как написать грамотный блок обработки ошибки, чтобы:
а)точно диагностировать точку DeadLockа,
б) как-то довести процесс до конца, чтобы не вылетала программа.
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32727681
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Так Вы концов не найдете... и обработка ошибок вам здесь не поможет... Идите лучше на форум по MS SQL... Там мобть и посоветуют как найти пр-е место... и как следует бороться с мб
2. Ну... споймав эту ошибку попробуйте повторить операцию через задержку... можно сделать ограничение на кол-во таких попыток...
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32727784
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StokКак написать грамотный блок обработки ошибки, чтобы:
а)точно диагностировать точку DeadLockа,
б) как-то довести процесс до конца, чтобы не вылетала программа.Начнем с пункта б)
б) - я ниже привел очень простой пример обработчика ошибок, к-й по крайней мере позволит "как-то довести процесс до конца, чтобы не вылетала программа".
Его можно дополнить помня о том, что в ADO ошибки, пришедшие с сервера хранятся в коллекции ActiveConnection.Errors, следовательно в обработчике ошибок можно анализировать ее на предмет соответствия определенному номеру ошибки.
Можно воспользоваться недокументированной (кажется) функцией Erl, которая вернет номер стороки кода с ошибкой. Но строки должны быть пронумерованы. В MSDN обработка ошибок достаточно хорошо документирована. Почитайте Debugging Your Code and Handling Errors, Generating and Handling Errors in ActiveX Components

а) теперь главное. Deadlock-и надо ловить серверными средствами,это быстрее и точнее. Спросите (а перед этим поищите) на главном форуме, но перед этим прочтите раздел BooksOnLine Troubleshooting Deadlocks

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Private Sub Form_Load()
On Error GoTo err_proc
Dim CmdT As New ADODB.Command
Dim strError As String
   Set CmdT.ActiveConnection = "Provider=SQLOLEDB.1;User ID=..."
   CmdT.CommandType = adCmdText
   CmdT.CommandTimeout =  0 
     CmdT.CommandText = "Delete ...."
     strError = "Deadlok on Delete"
     CmdT.Execute
     CmdT.CommandText = "Insert ...."
     strError = "Deadlok on Insert"
     CmdT.Execute
     CmdT.CommandText = "Update ...."
     strError = "Deadlok on Update"
     CmdT.Execute
     CmdT.CommandText = "EXEC [dbo].[My_SyncData] "
     strError = "Deadlok on EXEC"
     CmdT.Execute

Exit Sub
err_proc:
    MsgBox "Error" & strError
End Sub
PS: кстати я у вас в коде транзакции не увидил. Это так надо ?
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32728039
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно воспользоваться недокументированной (кажется) функцией Erl, которая вернет номер стороки кода с ошибкой

Эта функция вернет номер строки, только если эти номера предварительно проставлены :-)...
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32728169
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желательно смотреть QA , какие транзакции лочатся, смотреть запросы. Во многих случая это дело можно оптимизировать.
Также, в зависимости от важности транзакций, пересмотреть Isolation Level.

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


Magnus
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32728228
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23
такие вызовы не могут вызвать дедлок, максимум - должны отваливатся по таймауту

Мы не знаем что происходит в процедуре My_SyncData.
А там может происходить все, что угодно.
П.э. я посоветовал диагностировать Deadlock на сервере.
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32728306
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Kudinov Magnus23
такие вызовы не могут вызвать дедлок, максимум - должны отваливатся по таймауту

Мы не знаем что происходит в процедуре My_SyncData.
А там может происходить все, что угодно.
П.э. я посоветовал диагностировать Deadlock на сервере.
Хм, я на твой код смотрел и мне что то казалось будто у него локи на всех вызовах :).
При таком раскладе, лочится действительно может только My_SyncData с каким то другим процессом, либо сама с собой из другого клиента.

2 автор
Код My_SyncData можно глянуть?
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32728338
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23При таком аскладе лочится действительно может только My_SyncData с каким то другим процессом, либо сама с собой из другого клиента.
а если на каждой или какой-то из этих таблиц или View, над которыми происходят Delete, Insert, Update висит триггер, который делает неизвестно что ?
:)
Я не придираюсь, я просто еще раз говорю - что эту проблему лучше решать на сервере, следую рекомендациям BOL, чем гадать здесь.
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32728428
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Kudinov Magnus23При таком аскладе лочится действительно может только My_SyncData с каким то другим процессом, либо сама с собой из другого клиента.
а если на каждой или какой-то из этих таблиц или View, над которыми происходят Delete, Insert, Update висит триггер, который делает неизвестно что ?
:)
Я не придираюсь, я просто еще раз говорю - что эту проблему лучше решать на сервере, следую рекомендациям BOL, чем гадать здесь.
Судя по представленному коду, думаю триггеров там нет :), это все вообще надо делать в хранимке в пределах одной транзакции.

Я ж про сервер и говорю, sp_lock ;)
Эту проблему однозначно нужно решать на сервере. На клиенте можно только костыли подставлять :).

2 Stok
Ну ты понял, телепаты в отпуске :), коды всего что есть в студию! Или он уже на ГФ убег? :)
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32729540
Stok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо, джентльмены, в первую очередь - Alexey Kudinov!
То, что надо ковыряться на сервере - это было ясно с самого начала. Но, поскольку ошибка крайне нестационарная, надо было локализовать условия ее возникновения у клиента.
Не имея под руками MSDN и не очень разбираясь в VB, я просто хотел узнать, как в обработчике представить объект ADO Error. Написал пока следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
      Dim Errs1 As Errors, i As Integer, StrTmp, errLoop As Error
      On Error GoTo AdoError
<Основной текст...>
   AdoError:
      On Error Resume Next
      i =  1 
       ' Ошибка VB 
      StrTmp = StrTmp & vbCrLf & "VB Error # " & Str(Err.Number)
      StrTmp = StrTmp & vbCrLf & "   Сгенерировано при " & Err.Source
      StrTmp = StrTmp & vbCrLf & "   Смысл:  " & Err.Description
      StrTmp = StrTmp & vbCrLf & "   Строка SQL:  " & CmdT.CommandText
       ' Ошибки ADO 
      Set Errs1 = ActiveConnection.Errors
      For Each errLoop In Errs1
         With errLoop
            StrTmp = StrTmp & vbCrLf & i & ":" & "   ADO Error   #" & .Number
            StrTmp = StrTmp & vbCrLf & "   Описание  " & .Description
            StrTmp = StrTmp & vbCrLf & "   Source    " & .Source
            StrTmp = StrTmp & vbCrLf & "   SQLstate    " & .Source
           i = i +  1 
         End With
      Next
      MsgBox StrTmp
      GoTo Done   ' Закрытие коннекции и выход из процедуры 
   End Sub
Пошел ждать, что получится. А можно залезть на сервер еще глубже (например, раскрутить информацию по Process ID)?
Смерть DeadLock-ам
...
Рейтинг: 0 / 0
Обработка DeadLock-ов в ADO
    #32729824
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StokAdoError:
On Error Resume Next
i = 1
' Ошибка VB
StrTmp = StrTmp & vbCrLf & "VB Error # " & Str(Err.Number)
StrTmp = StrTmp & vbCrLf & " Сгенерировано при " & Err.Source
StrTmp = StrTmp & vbCrLf & " Смысл: " & Err.Description
StrTmp = StrTmp & vbCrLf & " Строка SQL: " & CmdT.CommandText
' Ошибки ADO

On error resume next сбрасывает ошибку в объекте Err.
Следовательно строки, идущие после On Error Resume Next и касающиеся объекта Err бессмысленны.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Form_Load()
On Error GoTo err_proc
    Dim a As Long
    Dim b As Long
    a =  1 
    b =  0 
    Debug.Print a / b
Exit Sub
err_proc:
     'On Error Resume Next 
    MsgBox Err.Description
End Sub
Stok...Но, поскольку ошибка крайне нестационарная, надо было локализовать условия ее возникновения у клиента....
Пошел ждать, что получится...
Вам не ждать надо. Вернее ждать, но так. Надо прочитать раздел BOL Troubleshooting Deadlocks. Там написано как правильно "жать" Deadlock-а. BOLWith SQL Server 2000, you can determine the resources involved in a deadlock and troubleshoot locking by using SQL Profiler or Trace Flag 1204
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка DeadLock-ов в ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]