2016-11-11 66 views
0

我有多線程JEE應用程序運行SELECT FOR UPDATE LIMIT 1;使用WHERE子句在表上查詢並在每個事務中更新行,這會創建行級寫入鎖定並且不會阻止讀取器讀取。Postgres寫/讀鎖

有沒有什麼辦法可以配置postgres,阻止讀者使用寫入鎖讀取行?

回答

0

這裏是你的選擇,如果你是runnint Postgres的< = 9.4,其中NOWAIT存在,但SKIP LOCKED。這演示了在LOOP中使用CONTINUEEXIT以便識別下一個可用的解鎖單行。

DO $$ 
DECLARE 
    r RECORD; 
    ... -- your variables 
BEGIN 
    FOR r IN 
     SELECT some_id 
      FROM some_table 
     WHERE ... -- your conditions 
     ORDER BY ... -- your ordering 
     LIMIT ... -- your limit 
    LOOP 
     BEGIN 
      SELECT ... -- your needed column(s) 
       INTO ... -- your defined variable(s) 
       FROM some_table -- the same table 
      WHERE some_id = r.some_id -- only check this one record 
       FOR UPDATE NOWAIT; -- don't wait for parallel transactions 
      EXIT; 
     EXCEPTION WHEN lock_not_available THEN 
      CONTINUE; 
     END; 
    END LOOP; 
    ... -- do something based on variables, or move this before the EXIT above 
END; 
$$ LANGUAGE plpgsql;