2017-02-13 16 views
0

TL; DR。我希望鎖定的行不會被後續查詢使用,直到鎖定被釋放。並行訪問行:使鎖定行「不可見」

我正在研究依賴併發訪問數據的應用程序。

我有需要處理的數據以及數千個需要在同一組數據上運行的SQL查詢。在應用程序級別上,我將所有SQL查詢序列化爲一個大隊列,並逐個在事務中執行它們。

但是,我想要刪除我在應用程序級別上所做的人爲「隊列」瓶頸,完全依靠數據庫的內置併發基元混合&基於光標的數據訪問。

爲此,我需要確保兩個併發SQL查詢從未獲取相同的集合行,例如,以前的查詢會鎖定行並且以後的查詢會忽略鎖定的行。

我想讓下面的圖片起作用(例子通過意圖簡化;考慮每個SELECT使用基於遊標的訪問在事務中運行)。

SELECT * FROM my_table ORDER BY id LIMIT 5; -- returns rows with IDs 1, 2, 3, 4, 5 
SELECT * FROM my_table ORDER BY id LIMIT 5; -- returns rows with IDs 6, 7, 8, 9, 10 

我的問題是:這甚至有可能嗎?或者我從數據庫中請求過多?

回答

2

在PostgreSQL 9.5或更高版本,可以在事務中做到這一點:

SELECT * FROM my_table 
ORDER BY id 
LIMIT 5 
FOR UPDATE SKIP LOCKED; 
+0

你是我的英雄。 – gmile