2016-11-11 49 views
0

私はSELECT FOR UPDATE LIMIT 1を実行するマルチスレッドJEEアプリケーションを持っています。行レベルの書込みロックを作成し、読取りをブロックすることはありません。Postgres書き込み/読み取りロック

ポストグルを設定する方法はありますか?読者が書き込みロックで行を読み込まないようにする方法はありますか? postgresのオン

答えて

1

9.5以降がSKIP LOCKEDオプションです:

あなたのトランザクションが完了するまで、テーブルからSELECTと更新されてから、これらの行を保護する必要がある場合は、FOR UPDATEを指定しますが、いくつかの場合行がロックされている場合は、SKIP LOCKEDを指定して、単純にそれらの行を無視し、アクセスできる行のいずれかで操作を実行するように指定できます。ここで

https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#SKIP_LOCKED

0

あなたはrunnint Postgresの< = NOWAITが存在して9.4が、SKIP LOCKEDであればあなたのためのオプションです。これは、次に利用可能なロック解除された単一行を識別するためにLOOPCONTINUEEXITの使用を示します。

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; 
関連する問題