READ-COMMITTED でアクティブ件数上限つき挿入を原子化するアンカーロック
データベース
並行制御
知識
判断
非同期タスクなどで「同一キーのアクティブ行が N 件未満のときだけ INSERT する」上限制御を、READ-COMMITTED 分離レベルの RDB でレース無く実現する設計。素朴に対象行を locking read(FOR UPDATE)してから件数判定+INSERT しようとすると、アクティブ0件のケースではロック対象の行が存在せず直列化できず、複数トランザクションが同時に「0件」と判定して上限を超過する。対策は、必ず存在する親行(テナント行など)をアンカーとして FOR UPDATE でロックし、その保護下で count と INSERT を同一トランザクションで行うこと。上限判定の粒度に対応する「必ず1行存在する上位エンティティ」をロックアンカーに選ぶのが要点。アプリ層のセマフォや一意制約では表現しづらい「N 件まで許容」型の制御に有効。