2016-03-30 35 views
0

因此,考慮本次交易:select for update如何適用於多行/結果查詢?

select * from table_a where field_a = 'A' for update; 

假設這給出了多行/結果,將在數據庫鎖定所有的結果馬上蝙蝠?或者一次鎖定一行。

如果後者爲真,是否意味着同時運行此查詢會導致死鎖?

因此,爲了解決這個問題,需要增加一個訂單以保持訂單的一致性?

回答

2

documentation解釋發生的事情如下:

FOR UPDATE

FOR UPDATE導致由SELECT語句檢索是 鎖定彷彿要更新的行。這可以防止他們被鎖定, 修改或刪除其他交易,直到當前 交易結束。也就是說,其他試圖UPDATE交易, DELETESELECT FOR UPDATESELECT FOR NO KEY UPDATESELECT FOR SHARESELECT FOR KEY SHARE這些行的將被阻塞,直到 當前事務結束;相反,SELECT FOR UPDATE將 等待在同一行上運行這些命令中的任何一個命令 的併發事務,然後鎖定並返回更新的行(或者如果該行被刪除,則返回沒有 行)。但是,在REPEATABLE READSERIALIZABLE事務中,如果自事務啓動以來要鎖定的行已更改,則會引發錯誤。關於進一步的 討論請參見第13.4節。

直接回答你的問題是,Postgres無法鎖定所有的行「馬上蝙蝠」;它必須首先找到它們。請記住,這是行級鎖定而不是表級鎖定。

文檔包括本說明:所選的行以標記它們鎖定,所以 會導致磁盤寫

SELECT FOR UPDATE修改。

我認爲這是說Postgres執行SELECT查詢,並且當它發現行時,它將它們標記爲鎖定。當Postgres識別行時,鎖定(對於給定行)開始。它一直持續到交易結束。

基於此,我認爲使用SELECT FOR UPDATE可能會出現死鎖情況。

相關問題