Предотвратить параллельный поиск в последовательности оракула

0

У меня есть код, который выбирает следующую последовательность из базы данных Oracle:

SELECT JOB_SEQ.NEXTVAL FROM DUAL;

Проблема в том, что это генерирует ORA-00900 (что не помогает, потому что реальная проблема связана с параллелизмом, а не с недействительным оператором SQL). Эта ошибка возникает, когда в тот же момент два сценария, которые запускаются параллельно (методом forking), пытаются запустить этот запрос.

Каков самый простой способ гарантировать, что выбор не произойдет одновременно? я

Стек, с которым я работаю, - это PHP/Linux. Я прочитал о очередях обмена сообщениями и предпочел бы избежать этого маршрута, если это возможно. Если что-то вроде сокетов Unix могло бы работать (т.е. Никакого дополнительного программного обеспечения для развертывания), тогда я бы предпочел именно так.

  • 1
    Весь смысл последовательностей заключается в предоставлении уникальных значений нескольким параллельным потокам. Мне кажется крайне маловероятным, что одновременный вызов nextval в нескольких сеансах приведет к ошибке, не говоря уже об ошибке ORA-00900. Если бы это было так, огромное количество систем было бы сломано. Я полагаю, вы могли столкнуться с ошибкой в базе данных, которая стоила бы поискать в Metalink или поднять заявку с поддержкой для разрешения. Но я бы положил деньги на то, что в вашем приложении есть ошибка параллелизма, которая приводит к генерированию неверного оператора SQL.
  • 0
    Как я понимаю, разветвление копирует все ресурсы и файловые дескрипторы. Технически, выбор происходит из одного и того же сеанса, который используется обоими процессами. Простой способ проверить эту теорию - выполнить оператор пересоединения в разветвленных процессах, чтобы гарантировать, что у них есть свой собственный сеанс. Я попробую это сейчас.
Показать ещё 2 комментария
Теги:
fork

1 ответ

0
Лучший ответ

Таким образом, проблема заключается в характере разветвления и как работают сессии Oracle.

Если вы разблокируете процесс, вы должны убедиться, что сеансы базы данных в дочерних процессах разные.

Когда вы пытаетесь выбрать последовательность из одного и того же сеанса Oracle, OCI или сама база данных не знают, как с этим справиться.

Но, если сеансы разные, у вас нет проблем. Это можно сделать просто, выпуская oci_close() и oci_connect(), если вы используете расширение oci8 в PHP.

РЕДАКТИРОВАТЬ: Кредит Джастин Кейв (см. Выше) для объяснения того, что выбор последовательностей работает на разных сеансах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню