因此,考慮本次交易:select for update如何適用於多行/結果查詢?
select * from table_a where field_a = 'A' for update;
假設這給出了多行/結果,將在數據庫鎖定所有的結果馬上蝙蝠?或者一次鎖定一行。
如果後者爲真,是否意味着同時運行此查詢會導致死鎖?
因此,爲了解決這個問題,需要增加一個訂單以保持訂單的一致性?
因此,考慮本次交易:select for update如何適用於多行/結果查詢?
select * from table_a where field_a = 'A' for update;
假設這給出了多行/結果,將在數據庫鎖定所有的結果馬上蝙蝠?或者一次鎖定一行。
如果後者爲真,是否意味着同時運行此查詢會導致死鎖?
因此,爲了解決這個問題,需要增加一個訂單以保持訂單的一致性?
的documentation解釋發生的事情如下:
FOR UPDATE
FOR UPDATE
導致由SELECT
語句檢索是 鎖定彷彿要更新的行。這可以防止他們被鎖定, 修改或刪除其他交易,直到當前 交易結束。也就是說,其他試圖UPDATE
交易,DELETE
,SELECT FOR UPDATE
,SELECT FOR NO KEY UPDATE
,SELECT FOR SHARE
或SELECT FOR KEY SHARE
這些行的將被阻塞,直到 當前事務結束;相反,SELECT FOR UPDATE
將 等待在同一行上運行這些命令中的任何一個命令 的併發事務,然後鎖定並返回更新的行(或者如果該行被刪除,則返回沒有 行)。但是,在REPEATABLE READ
或SERIALIZABLE
事務中,如果自事務啓動以來要鎖定的行已更改,則會引發錯誤。關於進一步的 討論請參見第13.4節。
直接回答你的問題是,Postgres無法鎖定所有的行「馬上蝙蝠」;它必須首先找到它們。請記住,這是行級鎖定而不是表級鎖定。
文檔包括本說明:所選的行以標記它們鎖定,所以 會導致磁盤寫
SELECT FOR UPDATE
修改。
我認爲這是說Postgres執行SELECT
查詢,並且當它發現行時,它將它們標記爲鎖定。當Postgres識別行時,鎖定(對於給定行)開始。它一直持續到交易結束。
基於此,我認爲使用SELECT FOR UPDATE
可能會出現死鎖情況。