我遇到了一些我没想到的行为。我有一个通过 PHP/OCI8 启动的同步过程。在该过程的开始有一个SELECT...FOR UPDATE NOWAIT
我这样做NOWAIT
是因为我希望用户立即通过错误消息通知该进程已经在运行,而不是让他们的浏览器等待锁定。
当我从具有两个单独 PHP 会话的两台单独的计算机上运行该过程时,我得到了预期的行为:一台运行,而另一台运行ORA-00054: resource busy and acquire with NOWAIT specified
.
但是,当我在同一个浏览器上打开两个选项卡并运行该过程时,第二个选项卡会等待 30 多秒以使第一个选项卡完成,然后运行第二个选项卡——就好像我没有指定NOWAIT
.
我没有使用任何类型的持久连接或连接池。我认为一个单独的 HTTP 请求,执行单独的 PHP=>Oracle 连接,会给我单独的数据库会话。不是这样吗?
更新:我在 #6 下找到了这个:http ://wiki.oracle.com/page/PHP+Oracle+FAQ,如何使用 OCI8 扩展连接到 Oracle?它说:
如果在脚本或 httpd 服务器会话中多次使用相同的用户凭据,PHP 将共享/重用连接。您可以使用 oci_new_connect() 函数来确保使用新会话。调用 oci_pconnect() 函数以建立在脚本结束时未关闭的持久连接(使下一个脚本中的重新连接更快)。
但是,当我更改oci_new_connect
它并不能解决问题。不同计算机上的不同会话抛出ORA-00054
,但同一浏览器上的两个选项卡同步访问但不尊重NOWAIT
。