我在Ubuntu 15.10和Freebsd上使用PHP 7(5.6.11)和postgresql 9.4。如何檢測爲什麼鎖錶行?
我的代碼從表格中選擇單行,帶有「for update」選項。 有時(一個數百個)這個查詢執行很長時間,大約20-90秒。我的代碼在大約30個線程中工作。
據我所知,「select * from table for update」只鎖定表中的單個行,並且只有在另一個進程已經選擇了該行時,我才能獲得這樣的行爲。我對嗎?但它不能發生,因爲腳本只有在從消息代理獲取消息後才執行。
單行消息。所以我無法想象誰和爲什麼可以阻止這一行。 (在一個地方使用select * from table for update
,我從隊列中獲取消息)。
我嘗試使用來自pg_locks和ps ax輸出的信息。在選擇更新之前,我保存這些信息,然後,如果我發現長時間查詢,我會在日誌中發送此信息。我看到進程鎖定表的PID,但我沒有看到在ps ax輸出這個PID。這讓我困惑。
有沒有人有任何想法?
您將需要爲此提供文檔。假設這是此時「暫停」的唯一查詢,那麼它確實聽起來像鎖定。但是,我從來沒有聽說過沒有列入pg_locks中的鎖。 –