본문 바로가기
TIL

TIL 240704 - UpdateValuesMissingError 에러해결 / Isolation Level 적용

by lemonpie611 2024. 7. 4.

1. 에러

Cannot perform update query because update values are not defined. Call "qb.set(...)" method to specify updated values.

 

다음과 같은 에러가 떴는데, 작성한 Service 코드에는 문제가 없었다.

DB를 살펴보던 중 Tickets와 Seats간 1:1 relation을 설정했는데도 Tickets에 외래키가 생성되지 않음을 확인

Tickets Entity에 @JoinColumn 데코레이터를 추가하여 외래키를 생성하였다.

  @OneToOne(() => Seats, (seat) => seat.tickets)
  @JoinColumn()
  seat: Seats;

 

2. Isolation Level 적용

  • READ UNCOMMITTED: 다른 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있음. 데이터 일관성이 보장되지 않기 때문에 권장X
  • READ COMMITTED: 다른 트랜잭션이 커밋된 데이터만 읽을 수 있음. 데이터 일관성이 보장
  • REPEATABLE READ: 동일한 쿼리를 반복해서 실행해도 결과가 항상 같음. 트랜잭션 동안 읽은 데이터에 대한 락 설정 > 다른 트랜잭션에서 해당 데이터 수정 불가능
  • SERIALIZABLE: 모든 트랜잭션을 직렬화하여 실행, 가장 높은 고립성 수준으로 데이터 일관성을 최대한 보장하지만 동시성이 매우 낮아져서 성능 저하

예매 기능에서, 다른 계정이 같은 좌석을 선택할 경우, 나중에 선택한 계정에는 이선좌가 떠야한다. 따라서 한 사람이 좌석 선택을 끝내고 커밋 된 후의 좌석 상태를 읽어와야 하기 때문에 READ COMMITTED를 사용했다.

  • 다른 계정이 같은 좌석을 선택 > 한 계정이 좌석을 선택하고 커밋이 완료될때까지 접근 불가능, 커밋이 완료된 후 접근
  • 다른 계정이 다른 좌석을 선택 > 서로 간섭 X