我正在經歷一些我沒想到的行爲。我有一個通過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
。
對不起,我不熟悉這些。我們將會話存儲在單獨的數據庫中,但它與默認的基於php文件的會話機制非常類似。假設兩個選項卡共享同一個會話,您是否說內部PHP會將該共享會話與單個數據庫會話相關聯? – 2010-07-19 16:08:51
不,數據庫會話將是不同的。但是,如果您還使用FOR UPDATE加載php會話,則腳本可能會在啓動PHP會話時掛起,而不是等待其他FOR UPDATE過程。 – Wrikken 2010-07-19 17:21:23
PHP會話未加載FOR UPDATE。 – 2010-07-19 18:18:17