私はSELECT FOR UPDATE LIMIT 1を実行するマルチスレッドJEEアプリケーションを持っています。行レベルの書込みロックを作成し、読取りをブロックすることはありません。Postgres書き込み/読み取りロック
ポストグルを設定する方法はありますか?読者が書き込みロックで行を読み込まないようにする方法はありますか? postgresのオン
私はSELECT FOR UPDATE LIMIT 1を実行するマルチスレッドJEEアプリケーションを持っています。行レベルの書込みロックを作成し、読取りをブロックすることはありません。Postgres書き込み/読み取りロック
ポストグルを設定する方法はありますか?読者が書き込みロックで行を読み込まないようにする方法はありますか? postgresのオン
9.5以降がSKIP LOCKED
オプションです:
あなたのトランザクションが完了するまで、テーブルからSELECTと更新されてから、これらの行を保護する必要がある場合は、FOR UPDATEを指定しますが、いくつかの場合行がロックされている場合は、SKIP LOCKEDを指定して、単純にそれらの行を無視し、アクセスできる行のいずれかで操作を実行するように指定できます。ここで
https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#SKIP_LOCKED
あなたはrunnint Postgresの< = NOWAIT
が存在して9.4が、SKIP LOCKED
であればあなたのためのオプションです。これは、次に利用可能なロック解除された単一行を識別するためにLOOP
にCONTINUE
とEXIT
の使用を示します。
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;