3
比方說,有多個並行交易,所有做同樣的查詢:postgresql是SELECT FOR UPDATE多行原子?
SELECT * FROM table1 FOR UPDATE;
可這導致死鎖?
換句話說。上述語句中的操作是「鎖定所有行」還是在處理記錄時沿途獲取的鎖?
比方說,有多個並行交易,所有做同樣的查詢:postgresql是SELECT FOR UPDATE多行原子?
SELECT * FROM table1 FOR UPDATE;
可這導致死鎖?
換句話說。上述語句中的操作是「鎖定所有行」還是在處理記錄時沿途獲取的鎖?
是的,它可能導致死鎖。
這很容易演示。建立一個測試表:
CREATE TABLE t AS SELECT i FROM generate_series(1,1000000) s(i);
...然後並行運行這兩個查詢:
SELECT i FROM t ORDER BY i FOR UPDATE;
SELECT i FROM t ORDER BY i DESC FOR UPDATE;
可以防止死鎖的發生,確保所有進程獲得他們鎖在同一順序。或者,如果要鎖定表中的每條記錄,可以使用table lock:
LOCK t IN ROW SHARE MODE;