我在Postgres中使用pg_try_advisory_lock()
。Postgres pg_try_advisory_lock阻止所有記錄
接下來兩個查詢在table1
鎖定多個記錄:
1)
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
WHERE
table2.id = 1
AND
pg_try_advisory_lock('table1'::regclass::integer, a.id)
LIMIT 1;
但
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
WHERE table2.id = 1
返回一個記錄。
2)
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
JOIN table3 c ON b.table2_id = c.id
WHERE
table3.id = 1
AND
pg_try_advisory_lock('table1'::regclass::integer, a.id)
LIMIT 1;
但我需要pg_try_advisory_lock()
只鎖定一個記錄。
怎麼了?
UPD
但奇怪的是,當我運行下面的查詢
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
WHERE
pg_try_advisory_lock('table1'::regclass::integer, a.id)
LIMIT 1;
Postgres的鎖只有一行。那麼,Postgres掃描第一行然後停止?我不明白:它應該掃描所有行,然後將結果限制爲一行,否則?
我不需要select ... for update,因爲另一個腳本必須找到另一個記錄。 – fdoo4un
我仍然認爲你應該鎖定在app-land中,而不是在sql-land中。 –
CTE工作良好。謝謝你的建議! 此外我更新了問題。見plz。 – fdoo4un