왜 SELECT FOR UPDATE가 필요했을까?
MySQL트랜잭션백엔드
문제 상황
수강신청 시스템에서 여러 사용자가 동시에 같은 강의에 신청할 경우, 정원이 초과될 수 있는 Race Condition 문제가 발생했습니다.
해결 방법
MySQL의 트랜잭션과 행 잠금(Row Lock)을 조합하여 해결했습니다.
START TRANSACTION;
SELECT current_count, max_count
FROM courses
WHERE id = ? FOR UPDATE;-- 정원 확인 후 신청 처리
UPDATE courses SET current_count = current_count + 1 WHERE id = ?;
INSERT INTO enrollments (user_id, course_id) VALUES (?, ?);
COMMIT;
`FOR UPDATE`로 해당 행에 배타적 잠금을 걸어 다른 트랜잭션이 동시에 접근하지 못하도록 했습니다.