選択した特定の行でテーブルをロックする場合は、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で 最初のトランザクションを終了する前に。最初のトランザクションが終了するのを待っており、その直後に選択します。
私はサブシーケンスを制御する関数でそれを使用しています、そしてそれは素晴らしいです。楽しんでいただければ幸いです。