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