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でレコードレベルのロックができるとあるので、レコードレベルのロックで目的を果たせるか確認する予定です。
明示的ロック