我遇到了一些我没想到的行为。我有一个通过PHP / OCI8启动的同步过程。在流程开始时有一个SELECT...FOR UPDATE NOWAIT
我做NOWAIT
因为我希望用户立即收到错误消息,告知该进程已在运行,而不是让他们的浏览器等待锁定。
当我从具有两个单独PHP会话的两台独立计算机运行该过程时,我得到了预期的行为:一个运行而另一个运行ORA-00054: resource busy and acquire with NOWAIT specified
。
但是当我在同一个浏览器上打开两个标签并运行该过程时,第二个标签会等待第一个标签完成后的30秒以上,然后运行第二个标签 - 就像我没有指定{{ 1}}。
我没有使用任何类型的持久连接或连接池。我认为单独的HTTP请求,执行单独的PHP => Oracle连接,会给我单独的数据库会话。情况不是这样吗?
更新:我在#6下找到了这个:http://wiki.oracle.com/page/PHP+Oracle+FAQ,如何使用OCI8扩展连接到Oracle?它说:
PHP将共享/重用连接 使用相同的用户凭据 不止一次在脚本或httpd中 服务器会话。你可以使用 oci_new_connect()函数确保一个 使用新会话。打电话给 oci_pconnect()函数来制作一个 持久连接不是 在脚本结束时关闭 (在下一个重新连接 脚本快得多。)
但是,当我更改为NOWAIT
时,它无法解决问题。不同计算机上的不同会话会引发oci_new_connect
,但同一浏览器上的两个选项卡会同步访问但不尊重ORA-00054
。
答案 0 :(得分:0)
请记住,有“loadsession”然后有“savesession”
另一个进程可能会在此时间间隔内更新php会话,具体取决于会话驱动程序的工作方式。
答案 1 :(得分:0)
好的,所以这根本不是数据库问题。似乎Firefox 3.6.6排队了我的同步请求,毕竟它不是PHP或DB会话问题。有关该问题的探索,请参阅此问题:Does Firefox synchronize requests for the same page?