範囲ロックによる上限制御は本番の分離レベルと空集合競合で検証する
MySQL
テスト
並行処理
知識
運用
行数を読み、上限未満なら同じトランザクション内で追加する方式をロック付き読取で原子化する場合、インデックスがあることだけでは安全性を判断できない。InnoDB の READ COMMITTED では通常の検索・インデックス走査に gap lock が使われないため、条件に一致する既存行がゼロのときはロック対象がなく、複数トランザクションが同時にゼロ件を観測して全て追加できる。既存行がある境界値だけの並行テストは、その行ロックで偶然直列化され、この破綻を隠す。
レビューと設計では、実運用の分離レベル、実際に選択される複合インデックス、条件一致がゼロ件のケース、上限直前のケースを分けて確認する。テスト用 DB の既定分離レベルが本番と異なる場合は、本番条件を明示的に再現する。許可件数だけでなく、競合リクエストの失敗種別も確認し、deadlock や lock wait timeout が通常のサーバーエラーとして漏れないことを固定する。
不変条件として厳密な上限が必要で、predicate/gap lock の成立条件を環境横断で保証できない場合は、常に存在する mutex 行を同一順序でロックする、専用カウンタを原子的に更新する、または DB 制約で超過を不可能にする方式を優先する。範囲ロックを採るなら、空集合を含む同時実行テストを実 DB で通すことを採用条件にする。