У меня есть ряд сценариев, работающих параллельно как nohup на сервере AIX, размещающем оракула 10 г. Эти сценарии записаны кем-то еще и предназначены, чтобы быть выполненными одновременно. Все сценарии выполняют обновления на таблице. Я получаю ошибку,
РТЫ 00060: мертвая блокировка обнаружила при ожидании ресурса
В то время как я погуглил для этого, я нашел, http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm
Даже при том, что сценарии выполняют updation на той же таблице одновременно, они выполняют обновления на различных записях таблицы, определенной WHERE
пункт без перекрытий записей между ними.
Таким образом, это вызвало бы ошибку?.
Эта ошибка произойдет независимо от того, где обновления выполняются на таблице?.
Я должен избежать параллельных обновлений на таблице в любом случае?.
Странно я также нашел на журнале nohup.out, PL/SQL successfully completed
после вышеупомянутой заключенной в кавычки ошибки.
Это означает, что оракул восстановился с мертвой блокировки и завершил обновления успешно, или я должен повторно выполнить те сценарии последовательно? Любая справка приветствовалась бы.
Заранее спасибо.
Тупиковые ситуации могут возникать не только при блокировках строк, например см. , это . Скрипты могут конкурировать за другие ресурсы, такие как индексные блоки.
Я обходил это в прошлом, создавая параллелизм таким образом, чтобы разные экземпляры работали над частями рабочей нагрузки, которые с меньшей вероятностью повлияют на блоки, расположенные близко друг к другу; например, для обновления большой таблицы вместо настройки параллельных ведомых устройств с использованием чего-то вроде MOD (n, 10)
, я бы использовал TRUNC (n / 10)
что означает, что каждое ведомое устройство работало с непрерывным набором данных.
Есть, конечно, гораздо лучшие способы разделить работу для параллелизма, например DBMS_PARALLEL_EXECUTE .
Не знаете, почему вы получаете сообщение «PL / SQL успешно завершен», возможно, ваши сценарии обрабатывают исключение?