選択した特定の行でテーブルをロックする場合は、LOCK FIRST
する必要があります FOR UPDATE / FOR SHARE
を使用します ステートメント。たとえば、最初の行をロックする必要がある場合は、次のようにします。
BEGIN;
LOCK TABLE person IN ROW EXCLUSIVE MODE;
-- BLOCK 1
SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;
-- BLOCK 2
UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;
END;
BLOCK1
内 SELECT
の前 データベースに「ねえ、私はこのテーブルで何かをするので、そうするときは、このテーブルをこのモードでロックする」と言っているだけです。任意の行を選択/更新/削除できます。
しかし、BLOCK2
では FOR UPDATE
を使用する場合 その行を特定のモードの他のトランザクションにロックします(doc<を読んでください。 / a> 詳細については)。そのトランザクションが終了するまでロックされます。
例が必要な場合は、テストを実行して、別のSELECT ... FOR UPDATE
を実行してみてください。 BLOCK2
で 最初のトランザクションを終了する前に。最初のトランザクションが終了するのを待っており、その直後に選択します。
私はサブシーケンスを制御する関数でそれを使用しています、そしてそれは素晴らしいです。楽しんでいただければ幸いです。