# instinct: SELECT→INSERTのTOCTOU競合はON CONFLICT DO NOTHINGで原子的に解決する
## 根本原因
SELECT→INSERTの2ステップパターン(TOCTOU: Time-of-Check Time-of-Use)は並列リクエスト時に UniqueViolation を引き起こす。
本番で `favorites_user_id_video_id_key` UniqueViolation が観測された(2026-05-15 09:02)。
## ポイント
- `INSERT ... ON CONFLICT DO NOTHING` でSELECTを省略し原子的に処理する
- SQLAlchemy では `from sqlalchemy.dialects.postgresql import insert as pg_insert` を使う
- `db.execute(pg_insert(Model).values(...).on_conflict_do_nothing())` の形式
- 複数箇所に同じパターンが散在しやすい(FavoriteHelper.add/add_favorite/mixin)→ 全箇所を一括修正する
- UniqueViolation のエラーログを見たらまず TOCTOU を疑う
## 関連Issue
- vvv#354 / vvv PR#355
instinct: SELECT→INSERTのTOCTOU競合はON CONFLICT DO NOTHINGで原子的に解決する