一个PHP /应用程序会话是否对应一个Oracle /数据库会话?

时间:2010-07-19 15:56:54

标签: php oracle locking ora-00054

我遇到了一些我没想到的行为。我有一个通过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

2 个答案:

答案 0 :(得分:0)

请记住,有“loadsession”然后有“savesession”

另一个进程可能会在此时间间隔内更新php会话,具体取决于会话驱动程序的工作方式。

答案 1 :(得分:0)

好的,所以这根本不是数据库问题。似乎Firefox 3.6.6排队了我的同步请求,毕竟它不是PHP或DB会话问题。有关该问题的探索,请参阅此问题:Does Firefox synchronize requests for the same page?