🆘 문제

<aside> ⚠️ 예매 서비스 로직을 만들고 나서 바로 테스트를 했더니 트랜잭션이 50개 정도만 동시에 들어와도 LockAcquisitionException이 발생하고, TicketInfo의 남은 좌석 수가 실제 수치(총 좌석 수 - Reservation에서 count 합산)보다 더 많아 데이터 무결성이 깨지는 문제 발생했습니다.

</aside>

{
"statusCode":400,
"msg":"could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException"
}

👁‍🗨 분석

<aside> 💡 동시에 여러 트랜잭션이 TicketInfo Entity를 불러와서 남은 좌석 수 칼럼을 읽고 수정하는 과정에서 트랜잭션끼리 충돌이 발생해 데이터 무결성이 지켜지지 않는다고 판단했습니다.

</aside>


🌟 시도

1. 트랜잭션 격리 수준(isolation level)을 READ COMMITTED, REPEATABLE READ, SERIALIZABLE로 변경

@Transactional(isolation = Isolation.READ_COMMITTED)
@Transactional(isolation = Isolation.REPEATABLE_READ)
@Transactional(isolation = Isolation.SERIALIZABLE)

2. 낙관적 락(Optimistic Lock) 적용