hyungi
205a7bf3d5
fix(study): attempt (quiz_session_id, study_question_id) partial UNIQUE (R9)
...
submit_attempt FOR UPDATE(3ba9537 ) 1차 방어에 더해 DB 레벨 belt-and-suspenders — 모바일
더블탭/재시도가 어떤 경로로든 이중 attempt INSERT 에 도달해도 차단. prod 실측 중복 0
(GROUP BY HAVING count>1 = 0)이라 안전 — dedup DELETE 멱등 precaution + partial UNIQUE
(quiz_session_id IS NOT NULL). 세션 외 직접입력(NULL)은 비대상.
검증: migration_smoke PASS(post-baseline 361 적용). ★FOR UPDATE 가 정상경로선 막으므로
이 제약은 거의 트리거 안 됨 — 트리거 시 IntegrityError→500(should-never-happen 가시화);
graceful 409 변환이 필요하면 submit_attempt 에 try/except 추가 가능(별도).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-16 14:36:24 +09:00
..
2026-06-16 14:16:21 +09:00
2026-05-02 16:12:38 +09:00
2026-04-02 13:21:45 +09:00
2026-04-02 14:49:12 +09:00
2026-04-02 15:24:50 +09:00
2026-04-03 09:27:18 +09:00
2026-04-03 10:10:03 +09:00
2026-04-03 10:37:44 +09:00
2026-04-03 13:11:43 +09:00
2026-04-03 13:32:20 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 12:49:45 +09:00
2026-04-06 13:38:07 +09:00
2026-04-06 14:16:00 +09:00
2026-04-07 13:26:37 +09:00
2026-04-07 08:29:12 +09:00
2026-04-07 14:36:22 +09:00
2026-04-09 07:56:50 +09:00
2026-04-10 09:49:56 +09:00
2026-04-10 08:52:26 +09:00
2026-04-13 14:32:55 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:03:35 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-14 08:36:16 +09:00
2026-04-14 14:55:45 +09:00
2026-04-14 15:31:16 +09:00
2026-04-14 15:31:16 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 15:10:01 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:58:58 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-05-02 16:12:38 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 09:14:56 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 12:59:39 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:38:03 +09:00
2026-04-27 12:38:03 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-29 08:45:15 +09:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-05-01 07:22:31 +09:00
2026-05-01 07:22:31 +09:00
2026-05-01 00:06:23 +00:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:49:01 +09:00
2026-05-01 11:42:08 +09:00
2026-05-01 11:42:08 +09:00
2026-05-02 07:20:29 +09:00
2026-05-02 07:20:29 +09:00
2026-05-02 07:20:29 +09:00
2026-05-10 14:05:41 +09:00
2026-05-10 14:05:41 +09:00
2026-05-10 14:05:41 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:06:41 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 21:47:15 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-16 13:44:15 +09:00
2026-05-16 13:44:15 +09:00
2026-05-17 06:20:46 +00:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-19 08:54:07 +09:00
2026-05-19 08:54:07 +09:00
2026-05-24 06:11:29 +00:00
2026-05-24 06:11:29 +00:00
2026-05-24 07:01:34 +00:00
2026-05-24 07:01:34 +00:00
2026-05-24 07:01:34 +00:00
2026-05-24 12:47:41 +00:00
2026-05-24 12:47:41 +00:00
2026-05-24 13:12:42 +00:00
2026-05-24 13:12:42 +00:00
2026-05-24 13:45:30 +00:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-07 10:18:17 +09:00
2026-06-07 10:18:17 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-08 03:07:53 +00:00
2026-06-09 10:12:26 +09:00
2026-06-10 13:03:31 +09:00
2026-06-10 13:03:31 +09:00
2026-06-10 13:03:31 +09:00
2026-06-10 13:03:31 +09:00
2026-06-10 13:03:31 +09:00
2026-06-10 15:08:18 +09:00
2026-06-10 15:08:18 +09:00
2026-06-10 15:08:18 +09:00
2026-06-11 07:13:17 +09:00
2026-06-12 08:29:53 +09:00
2026-06-12 08:29:53 +09:00
2026-06-12 08:29:53 +09:00
2026-06-12 08:29:53 +09:00
2026-06-12 08:29:53 +09:00
2026-06-12 08:29:53 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-12 21:25:04 +09:00
2026-06-13 06:23:22 +09:00
2026-06-13 06:23:22 +09:00
2026-06-13 06:23:22 +09:00
2026-06-13 06:23:22 +09:00
2026-06-13 09:01:21 +09:00
2026-06-14 12:27:18 +09:00
2026-06-14 23:18:36 +00:00
2026-06-16 13:48:25 +09:00
2026-06-16 13:56:42 +09:00
2026-06-16 14:36:24 +09:00