티스토리 뷰

오늘은 트러블 슈팅에 대해서 포스팅 하려고 합니다.

 

[문제 상황]

비관적 락을 사용해서 좌석 예약시 동시성 제어를 할 수 있도록 프로그램을 개발했습니다.

그러나 5개명의 사용자가 1개의 좌석 예약을 했을 때, 5명 모두 좌석 예약에 성공하는 현상이 발생했습니다.

 

이론상 1개의 좌석이 먼저 선점되어 예약이 되면 나머지 4명은 좌석 예약 불가해야 합니다.

 

[문제가 발생한 코드]

  /** 좌석 예약 */
  @Transactional
  public ReservationResponse reserve(ReservationRequest request) {

    // 1. 사용자를 조회한다.
    User user = userManager.findUserById(request.getUserId());
    if(user == null) {
      throw new RuntimeException("[좌석 예약] 존재하지 않는 사용자입니다.");
    }

    Concert concert = concertManager.findConcertByConcertId(request.getConcertId());

    // 3. occupy에서 좌석을 비관적락으로 잠그고, 트랜잭션 처리를 한다.
    이 부분이 원인 => SeatP seat1 = seatManagerP.findSeatPBySeatId(request.getSeatP().getSeatId());
    SeatP occupiedSeat = seatManagerP.occupy(request.getSeatP().getSeatId(), user);

    ReservationRequest reservationRequest = new ReservationRequest(user, concert, occupiedSeat);

    Reservation reservation = reservationManager.reserve(reservationRequest);

    return ReservationResponse.fromP(reservation.getConcert().getConcertId(),
                                      reservation.getUser().getUserId(),
                                      occupiedSeat.getSeatNo(),
                                      occupiedSeat.getTempReservedExpiredAt());
  }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글