У меня есть код, который выбирает следующую последовательность из базы данных Oracle:
SELECT JOB_SEQ.NEXTVAL FROM DUAL;
Проблема в том, что это генерирует ORA-00900 (что не помогает, потому что реальная проблема связана с параллелизмом, а не с недействительным оператором SQL). Эта ошибка возникает, когда в тот же момент два сценария, которые запускаются параллельно (методом forking), пытаются запустить этот запрос.
Каков самый простой способ гарантировать, что выбор не произойдет одновременно? я
Стек, с которым я работаю, - это PHP/Linux. Я прочитал о очередях обмена сообщениями и предпочел бы избежать этого маршрута, если это возможно. Если что-то вроде сокетов Unix могло бы работать (т.е. Никакого дополнительного программного обеспечения для развертывания), тогда я бы предпочел именно так.
Таким образом, проблема заключается в характере разветвления и как работают сессии Oracle.
Если вы разблокируете процесс, вы должны убедиться, что сеансы базы данных в дочерних процессах разные.
Когда вы пытаетесь выбрать последовательность из одного и того же сеанса Oracle, OCI или сама база данных не знают, как с этим справиться.
Но, если сеансы разные, у вас нет проблем. Это можно сделать просто, выпуская oci_close() и oci_connect(), если вы используете расширение oci8 в PHP.
РЕДАКТИРОВАТЬ: Кредит Джастин Кейв (см. Выше) для объяснения того, что выбор последовательностей работает на разных сеансах.
nextval
в нескольких сеансах приведет к ошибке, не говоря уже об ошибке ORA-00900. Если бы это было так, огромное количество систем было бы сломано. Я полагаю, вы могли столкнуться с ошибкой в базе данных, которая стоила бы поискать в Metalink или поднять заявку с поддержкой для разрешения. Но я бы положил деньги на то, что в вашем приложении есть ошибка параллелизма, которая приводит к генерированию неверного оператора SQL.