powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / обработка deadlock
6 сообщений из 6, страница 1 из 1
обработка deadlock
    #35272653
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста можно ли в процедуре отловить и обработать ошибку deadlock.

Заранее большое спасибо
...
Рейтинг: 0 / 0
обработка deadlock
    #35272851
Peter Wilson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на уровне базы данных разве недостаточно обработки дэдлоков???
...
Рейтинг: 0 / 0
обработка deadlock
    #35272878
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поймать-то вы его, конечно, поймаете, но обрабатывать уже будет нечего. Ловите sqlstate 40001.
...
Рейтинг: 0 / 0
обработка deadlock
    #35275707
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Peter Wilsonа на уровне базы данных разве недостаточно обработки дэдлоков???
На уровне базы данных детектор произвольно выбирает жертву. Хотелось бы как-то в процедуре отловить что команада повисла на дедлоке и среагировать до того как об этом узнает детектор.

mustaccioПоймать-то вы его, конечно, поймаете, но обрабатывать уже будет нечего. Ловите sqlstate 40001.

A что если поймать до того как детектор грохнет один из процессов? Может быть тогда можно что-то ещё будет сделать.

Я вот подумал, что если в процедуре установить
SET CURRENT LOCK TIMEOUT 0 и потом создать обработчик на событие недоступности ресурса с циклом в котором команада будет вызываться до тех пор пока ресурс не освободится?
Тогда может быть вообще дедлоков возникать не будет?

Что-то вроде этого:
Код: 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.
25.
26.
27.
28.
CREATE PROCEDURE myshema.catch_deadlock()
SPECIFIC catch_deadlock
    MODIFIES SQL DATA
    NOT DETERMINISTIC
    NULL CALL
    LANGUAGE SQL
BEGIN
    DECLARE is_locked INTEGER DEFAULT  1 ;
    DECLARE c_is_locked CONDITION FOR SQLSTATE '57033'; 
    -- код ошибки для "Deadlock or timeout occurred without automatic rollback"

    DECLARE CONTINUE HANDLER FOR c_is_locked set is_locked =  1 ;

  SET CURRENT LOCK TIMEOUT  0 
  /*Дока говорит что "value of 0, which means that the database manager is not to wait 
  for locks that cannot be obtained, and an error (SQLSTATE 40001 or SQLSTATE 57033) 
  will be returned"*/
  
  WHILE (is_locked =  1 ) DO 
  /* 
    Если есть блокировка то continue handler для condition 57033 
    установит переменную is_locked из 0 в 1 и условие для while будет Т
    так что комманда будет отправлена ещё раз.
    Если блокировки нет, то  is_locked останется 0 и произойдёт выход из цикла.
  */
    SET is_locked =  0 ;
    update myshema.mytable set field1 =  1  where field2 =  2 ;
  END WHILE;
END

Но здесь опять вопрос возникает - что будет с производительностью? Насколько больше времени уйдёт на весь этот цикл по сравнению с обычным ожиданием ресурса.

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

Очень извиняюсь если коряво изложил свой вопрос.

Заранее всем большое спасибо.
...
Рейтинг: 0 / 0
обработка deadlock
    #35276215
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KruПодскажите пожалуйста можно ли в процедуре отловить и обработать ошибку deadlock.Обработать можно, только надо иметь ввиду следующее:
Поведением менеджера при lock timeout рулить можно с помощью переменной DB2LOCK_TO_RB , т.е. либо заставить его откатывать только команду, выполнившую запрос, либо всю транзакцию (по умолчанию).
При deadlock текущая транзакция всегда откатывается.

SET LOCK TIMEOUT 0 использовать нерационально, лучше какое-нибудь допустимое небольшое значение, приемлемое для ожидания. При его истечении можно и так, как у вас, но имейте ввиду то, что я написал выше.
...
Рейтинг: 0 / 0
обработка deadlock
    #35278662
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein KruПодскажите пожалуйста можно ли в процедуре отловить и обработать ошибку deadlock.Обработать можно, только надо иметь ввиду следующее:
Поведением менеджера при lock timeout рулить можно с помощью переменной DB2LOCK_TO_RB , т.е. либо заставить его откатывать только команду, выполнившую запрос, либо всю транзакцию (по умолчанию).
При deadlock текущая транзакция всегда откатывается.

SET LOCK TIMEOUT 0 использовать нерационально, лучше какое-нибудь допустимое небольшое значение, приемлемое для ожидания. При его истечении можно и так, как у вас, но имейте ввиду то, что я написал выше.

Огромное спасибо за ответ. С DB2LOCK_TO_RB есть одно большое неудобство - её нельзя задать из процедуры. Но в моём случае, кажется будет достаточно выставить приемлемое время ожидания и потом обработать ошибку таймаута.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / обработка deadlock
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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