행 잠금으로 동시 예약 중복 해결 경험
팀 프로젝트에서 여러 사용자가 동시에 좌석을 예약하는 기능을 만들다가 중복 예약이 발생하는 버그를 경험했습니다. 처음엔 애플리케이션 레벨에서 예약 전 빈 좌석 여부를 확인하는 로직을 넣었는데, 동시 요청 사이에 타이밍 차이가 생기면 두 트랜잭션이 모두 빈 것으로 판단하는 문제가 있었습니다. DB의 SELECT FOR UPDATE로 행 잠금을 걸고 트랜잭션 범위를 정확히 설정하니 문제가 사라졌습니다. 이 경험에서 정합성 문제는 대부분 잠금 범위와 트랜잭션 경계 설계 실수에서 온다는 걸 배웠고, 이후로는 동시성이 필요한 기능 설계 시 낙관적 잠금과 비관적 잠금 중 어느 쪽이 적합한지를 트래픽 패턴과 충돌 빈도를 기준으로 판단하게 됐습니다.