예매 테이블 MySQL에서 ElasticSearch 변경
MySQL에서 ElasticSearch로 변경완료
- 불필요한 클래스들 삭제
- Domain에 Reservation 폴더 구조 변경
- 테스트 확인 완료
[트러블슈팅] 티켓 구매 시 락 유효성 검사
- 좌석을 선택 한 사람이 구매를 무조건 해야한다.
- Redis에서 따로 해당 좌석의 키로 이메일을 저장을 한다.
- 그 후 구매 할 때 비교를 한다.
@Transactional
public void updateReservationStatusWithLocked(ElasticReservationRequestDto elasticReservationRequestDto,
String email) throws
InterruptedException {
String uuid = elasticReservationRequestDto.getReservationId();
String lockName = "seat_lock:" + uuid;
RLock rLock = redissonClient.getLock(lockName);
ElasticSearchReservation elasticSearchReservation = elasticSearchReservationRepository.findById(
elasticReservationRequestDto.getReservationId())
.orElseThrow(() -> new GlobalException(HttpStatus.NOT_FOUND, ExceptionCode.NOT_EXIST_RESERVATION));
long waitTime = 0L;
long leaseTime = 180L;
boolean isLockAcquired = rLock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS); // 락 획득 시도
if (!isLockAcquired) {
throw new GlobalException(HttpStatus.LOCKED, ExceptionCode.LOCKED);
}
**seatValidateRepository.save(new SeatValidate(uuid, email));**
elasticSearchReservation.updateStatus(Status.RESERVATION);
elasticsearchTemplate.update(elasticSearchReservation);
}
seatValidateRepository.save(new SeatValidate(uuid, email)); 를 추가하여 redis에 ‘seat_validate:좌석id’ 를 key값으로 ‘**email’**를 value로 추가
SeatValidate seatValidate = seatValidateRepository.findById(ticketRequestDto.getReservationId())
.orElseThrow(() -> new GlobalException(HttpStatus.NOT_FOUND, ExceptionCode.NOT_EXIST_SEAT));
if (!seatValidate.getEmail().equals(userEmail)) {
throw new GlobalException(HttpStatus.LOCKED, ExceptionCode.NOT_SELECT_LOCKED);
}
티켓 구매할 때 로그인한 유저의 email과 redis에 좌석의 id로 저장한 email을 비교하여 같은 경우에만 티켓을 구매 가능하도록 변경
'항해99' 카테고리의 다른 글
항해99 실전 프로젝트 (26일차) (0) | 2024.02.28 |
---|---|
항해99 실전 프로젝트 (25일차) (0) | 2024.02.27 |
항해99 실전 프로젝트 (23일차) (0) | 2024.02.26 |
항해99 실전 프로젝트 (22일차) (0) | 2024.02.23 |
항해99 실전 프로젝트 (21일차) (0) | 2024.02.22 |