왜 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`로 해당 행에 배타적 잠금을 걸어 다른 트랜잭션이 동시에 접근하지 못하도록 했습니다.

배운 점

  • 트랜잭션의 ACID 특성 중 Isolation(격리성)의 중요성
  • SELECT FOR UPDATE와 LOCK IN SHARE MODE의 차이
  • 데드락 방지를 위한 잠금 순서 일관성 유지
  • 박주영 | 백엔드 개발자 포트폴리오