У меня такое поведение, которого я не ожидал.У меня есть синхронная процедура, которая запускается через PHP / OCI8.В начале процесса есть SELECT...FOR UPDATE NOWAIT
Я делаю NOWAIT
, потому что я хочу, чтобы пользователи немедленно уведомлялись с сообщением об ошибке, что процесс уже запущен, вместо того, чтобы их браузер ждал блокировки.
Когда я запускаю процесс с двух отдельных компьютеров с двумя отдельными сеансами PHP, я получаю ожидаемое поведение: один запускается, а другой получает ORA-00054: resource busy and acquire with NOWAIT specified
.
Но когда я открываю две вкладкив том же браузере и запустите процесс, вторая вкладка ожидает более 30 секунд, пока не завершится первая, а затем запускает вторую - как будто я не указал NOWAIT
.
IЯ не использую постоянные соединения или пулы соединений любого рода.Я думал, что отдельный HTTP-запрос, выполняющий отдельные соединения PHP => Oracle, даст мне отдельные сеансы БД.Разве это не так?
ОБНОВЛЕНИЕ: Я нашел это: http://wiki.oracle.com/page/PHP+Oracle+FAQ под # 6, Как мне подключиться к Oracle с расширением OCI8? в нем говорится:
PHP будет совместно использовать / повторно использовать соединения, если одни и те же учетные данные пользователя используются более одного раза в сеансе сценария или на сервере httpd.Вы можете использовать функцию oci_new_connect (), чтобы убедиться, что используется новый сеанс.Вызовите функцию oci_pconnect (), чтобы создать постоянное соединение, которое не будет закрыто в конце скрипта (значительно ускоряя повторное соединение в следующем скрипте).
Однако, когда я изменяю на oci_new_connect
это не решает проблему.Разные сеансы на разных компьютерах выдают ORA-00054
, но две вкладки в одном браузере синхронизируют доступ, но не учитывают NOWAIT
.