2026-01-10
MySQL트랜잭션백엔드
MySQL 트랜잭션과 Row Lock으로 동시성 제어하기
수강신청 시스템 개발 중 동시 요청으로 인한 정원 초과 문제를 MySQL 트랜잭션과 SELECT FOR UPDATE를 활용해 해결한 경험을 정리했습니다.
기록 펼치기기록 접기
문제 상황
수강신청 시스템에서 여러 사용자가 동시에 같은 강의에 신청할 경우, 정원이 초과될 수 있는 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`로 해당 행에 배타적 잠금을 걸어 다른 트랜잭션이 동시에 접근하지 못하도록 했습니다.
배운 점
- 트랜잭션의 ACID 특성 중 Isolation(격리성)의 중요성
- SELECT FOR UPDATE와 LOCK IN SHARE MODE의 차이
- 데드락 방지를 위한 잠금 순서 일관성 유지