これは不可能だと思います。テーブルへの読み取り専用アクセスをブロックすることはできません(選択がFOR UPDATE
で行われない限り) )
私の知る限り、あなたが持っている唯一のチャンスは、pg_advisory_lock()
を使用することです。 関数。
http:// www .postgresql.org / docs / current / static / Functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
ただし、これには、それを介して取得したロックを「手動で」解放する必要があります。それでは自動ロック解除はできません。
行をロックするには、次のようなものが必要です。
select pg_advisory_lock(id), * from ( select * table1 order by id limit 5 ) t
(LIMIT部分の派生テーブルの使用に注意してください。説明については、私が投稿した手動リンクを参照してください)
次に、取得したIDを保存し、後でpg_advisory_unlock()
を呼び出す必要があります。 IDごとに。
各プロセスが常にすべてをリリースしている場合 IDを一度に使用すると、pg_advisory_unlock_all()
を使用できます。 代わりは。その後、取得したIDを保存する必要はありません。
これはないことに注意してください 他の人が「通常の」選択を使用して行を読み取らないようにします。そのテーブルにアクセスするすべてのプロセスが同じパターンのロック取得を使用している場合にのみ機能します。