ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PostgreSQLでテーブルロックをして更新する方法

SELECTしたレコードに対してUPDATEを行う処理が、別々に同時に行われる可能性があるので、テーブルをロックして更新することにしました。

PostgreSQLの場合以下のコードでできました。

BEGIN;
LOCK TABLE table1 IN ACCESS EXCLUSIVE MODE;
SELECT id FROM table1 WHERE type = 1 ORDER BY id LIMIT 2;
UPDATE table1 SET updatetime = now() WHERE id IN (2,3);
COMMIT;

PostgreSQLのマニュアルには、SELECT (省略) FOR UPDATEでレコードレベルのロックができるとあるので、レコードレベルのロックで目的を果たせるか確認する予定です。
明示的ロック