0

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

4

2 回答 2

0

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

根据您的会话驱动程序的工作方式,另一个进程可能会在此时间间隔内更新 php 会话。

于 2010-07-19T15:59:36.200 回答
0

好的,所以这根本不是数据库问题。相反,Firefox 3.6.6 似乎将我的同时请求排队,毕竟这不是 PHP 或 DB 会话问题。有关该问题的探索,请参阅此问题:Firefox 是否同步同一页面的请求?

于 2010-07-19T19:39:04.213 回答