powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Дедлок при курсоре
7 сообщений из 7, страница 1 из 1
Дедлок при курсоре
    #38168824
MaximFomenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер.

Есть следующий кусок логики.

Объявляем курсор:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
 EXEC SQL
   DECLARE effdepperccurs1 CURSOR FOR
    SELECT basedep_num, part_code, branch_code,
           basedepsum,  even_sum,  dbtturn_even,
           crdturn_even
      FROM basedep
     WHERE (((dbtturn_even <> 0.0) OR (crdturn_even <> 0.0)) AND (bdepstatus_num == 0));



Потом открываем его и в цикле читаем строчка за строчкой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 while (err != ST_SQLNOTFOUND)
  {
   EXEC SQL FETCH effdepperccurs1
                  INTO :_basedep_num, :_part_code, :_branch_code,
                       :_basedepsum,  :_even_sum,  :_dbtturn_even,
                       :_crdturn_even;

   ...
 }



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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
       EXEC SQL UPDATE basedep
                   SET (basedepsum, even_sum, dbtturn, crdturn,
                        dbtturn_even, crdturn_even, lastturndate) =
                       (basedepsum + :_even_sum, 0.0, :_dbtturn_even,
                        :_crdturn_even, 0.0, 0.0, :_operday)
                 WHERE ((basedep_num = :_basedep_num) AND
                        (part_code   = :_part_code)   AND
                        (branch_code = :_branch_code));



Все бы хорошо, если бы периодически не происходил как я понимаю дедлок:

-244 Could not do a physical-order read to fetch next row

Кто-то может объяснить от чего? Если от того что обновляется строка, которую только что считал курсор, то почему дедлок случается лишь иногда с некоторыми строками. А если не от этого, то откуда дедлок?

--
ВУЗы Украины
...
Рейтинг: 0 / 0
Дедлок при курсоре
    #38168945
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximFomenko, для обновления строк, которые выбираются в цикле, обычно используется SELECT ... FOR UPDATE OF...., UPDATE ... WHERE CURRENT OF ....
Или нужно таки разобраться откуда ноги ростут?
...
Рейтинг: 0 / 0
Дедлок при курсоре
    #38168995
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximFomenko-244 Could not do a physical-order read to fetch next row

откуда дедлок?

Ошибка -244 не обязательно означает deadlock (взаимная блокировка). Надо смотреть сопутствующее ISAM-сообщение.
Что бы сделать правильные выводы, для начала нужно глянуть на вывод onstat -u, onstat -g ses в момент появления ошибки. Возможно, что потребуется запустить oncheck на таблицу или индекс.
...
Рейтинг: 0 / 0
Дедлок при курсоре
    #38169374
MaximFomenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victor16MaximFomenko-244 Could not do a physical-order read to fetch next row

откуда дедлок?

Ошибка -244 не обязательно означает deadlock (взаимная блокировка). Надо смотреть сопутствующее ISAM-сообщение.
Что бы сделать правильные выводы, для начала нужно глянуть на вывод onstat -u, onstat -g ses в момент появления ошибки. Возможно, что потребуется запустить oncheck на таблицу или индекс.
Сопутствующее ISAM сообщение с кодом -143 - т.е. судя по описанию этого кода - таки дедлок.

Выполнение onstat -u, onstat -g ses в момент ошибки затруднено, т.к. дело происходит на базе клиента, который пользует софт. А доступа к их системе у меня нет.
...
Рейтинг: 0 / 0
Дедлок при курсоре
    #38169377
MaximFomenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойMaximFomenko, для обновления строк, которые выбираются в цикле, обычно используется SELECT ... FOR UPDATE OF...., UPDATE ... WHERE CURRENT OF ....
Или нужно таки разобраться откуда ноги ростут?
Ага, нашел примеры синтаксиса. Спасибо. Говорите это поможет?
...
Рейтинг: 0 / 0
Дедлок при курсоре
    #38169461
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximFomenkoАнатоЛой обычно используется SELECT ... FOR UPDATE OF...., UPDATE ... WHERE CURRENT OF ....
... Говорите это поможет?
Можно добавить совет выставить уровень изоляции, возможно с опцией RETAIN UPDATE LOCKS. Подробнее можно посмотреть в блоге SELECT… FOR UPDATE , ну или в документации.
...
Рейтинг: 0 / 0
Дедлок при курсоре
    #38169700
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если этот процесс может выполняться несколькими пользователями одновременно, то я бы добавил сортировку чтобы обрабатывать строки в одном и том же порядке.

SELECT basedep_num, part_code, branch_code,
....
order by basedep_num, part_code, branch_code, even_sum, dbtturn_even, crdturn_even;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Дедлок при курсоре
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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