2012-09-13 87 views
0

在我的web應用程序,一些查詢運行3分鐘(我知道,這是巨大的......)。 與此同時,另一個用戶嘗試更新同一個表中的數據。 看來,更新查詢等待結束選擇運行。更新鎖定選擇

是PostgreSQL的標準操作方式嗎?在選擇查詢結束之前是否有強制執行更新的方法?

謝謝。

+3

奇怪的是,默認情況下,PostgreSQL'select'不應該阻止'update',參見[MVVC](http://www.postgresql.org/docs/8.4/interactive/mvcc-intro.html)。在'select'查詢中顯式鎖定提示? – Andomar

+0

你在'select'中包含'for update'子句嗎?還是在運行'update'之前做了一個顯式的獨佔表鎖? –

+0

SELECT是否是事務的一部分,如果是,那麼涉及的其他查詢是什麼? –

回答

1

您不能禁用MVCC,所以這不是問題。 MVCC引用行存儲在磁盤上的方式,避免低鎖定。

您應該瞭解MVCC,以瞭解如何以及何時需要PostgreSQL鎖定。通常讀者不會阻止讀者或作者。很少有作家阻止讀者。

讀者和作者通常可以通過處理在聲明或事務生命週期內合理穩定的快照(確切的穩定性取決於事務級別)來避免阻塞彼此。

行鎖定仍然是可能的,但它必須明確要求。 SELECT ... FOR UPDATE將鎖定爲其選擇的行。因此,首先要做的是檢查並查看SELECT語句是否有for update謂詞。

如果不是的話,那麼請檢查隔離級別,並嘗試read committed隔離級別下運行

除此之外檢查pg_locks對錶,看看什麼是真正被鎖定。