2010-07-19 20 views
0

我正在經歷一些我沒想到的行爲。我有一個通過PHP/OCI8啓動的同步過程。在這個過程的開始有一個SELECT...FOR UPDATE NOWAIT一個PHP /應用程序會話是否對應一個Oracle /數據庫會話?

我做NOWAIT,因爲我希望用戶立即通知錯誤消息,該進程已在運行,而不是讓他們的瀏覽器等待鎖。

當我從兩個單獨的計算機運行兩個獨立的PHP會話的過程時,我得到預期的行爲:一個運行而另一個運行ORA-00054: resource busy and acquire with NOWAIT specified

但是,當我在同一瀏覽器上打開兩個選項卡並運行進程時,第二個選項卡會等待30+秒以完成第一個選項卡,然後運行第二個選項卡 - 就好像我沒有指定NOWAIT

我沒有使用任何類型的持久性連接或連接池。我認爲執行單獨的PHP => Oracle連接的單獨HTTP請求會給我單獨的DB會話。這不是這種情況嗎?

更新:我發現這個:http://wiki.oracle.com/page/PHP+Oracle+FAQ在#6下,如何使用OCI8擴展連接到Oracle?它說:

PHP將共享如果 相同的用戶憑據用於不止一次 更在腳本或httpd的 服務器會話/重複使用的連接。您可以使用 oci_new_connect()函數來確保使用 新會話。調用 oci_pconnect()函數,在 (使下一個 腳本的重新連接更快)結束時關閉非 的 持久連接。

但是,當我更改爲oci_new_connect它不能解決問題。不同計算機上的不同會話會丟棄ORA-00054,但同一瀏覽器上的兩個選項卡會同步訪問,但不會遵守NOWAIT

回答

0

記住,有「loadsession」再有就是「savesession」

這可能是另一個進程在此區間取決於您的會話驅動程序是如何工作的udpates PHP會話。

+0

對不起,我不熟悉這些。我們將會話存儲在單獨的數據庫中,但它與默認的基於php文件的會話機制非常類似。假設兩個選項卡共享同一個會話,您是否說內部PHP會將該共享會話與單個數據庫會話相關聯? – 2010-07-19 16:08:51

+0

不,數據庫會話將是不同的。但是,如果您還使用FOR UPDATE加載php會話,則腳本可能會在啓動PHP會話時掛起,而不是等待其他FOR UPDATE過程。 – Wrikken 2010-07-19 17:21:23

+0

PHP會話未加載FOR UPDATE。 – 2010-07-19 18:18:17

相關問題