예약하기 서비스 동시성 문제 해결하기
하나의 숙소에 겹치는 기간으로 2명이 동시에 예약을 시도할 경우
-> 처음에 만든 로직으로는 2명 다 예약이 성공함
시도1. synchronized 를 통해 어플리케이션 단에서 제어하기
-> 스프링 프레임워크에서 IOC 컨테이너에 빈 객체를 만들고 주입하는 방식이기에 모든 요청에서 동일한 서비스 객체를 사용하므로 인스턴스 메서드에 synchronized 해줘도 해결이 될 거라고 생각
-> 그런데 그대로 2명이 다 예약됌
시도2. 비관적 락을 통해 DB 단에서 제어하기
-> 비관적 락을 걸면 하나의 트랜잭션이 커밋을 하기 전까지 다른 트랜잭션이 데이터에 접근하지 못 하므로 해결될 것으로 예상
-> 하나의 트랜잭션에 의해서 DB에 데이터가 저장이 됐음에도 마치 커밋이 안 돼 락이 풀리지 않은 것처럼 데드락이 발생함...
시도3. synchronized + 비관적 락 (사실 실수로 시도하게 된 방법)
-> 해결이 됌.
-> 2번에서 발생하던 데드락이 발생하지 않는다는 것은 synchronized가 분명하게 둘 중 하나의 쓰레드가 먼저 작업을 끝낼 때까지 DB에 요청을 못 보내게 막았다는 것인데 대체 왜 synchronized만 붙였을 때는 안 됐는지 이해가 안 가 매니저님께 질문
'항해99' 카테고리의 다른 글
[WIL] Week 8 (0) | 2023.05.29 |
---|---|
[TIL] DAY 47 (0) | 2023.05.19 |
[TIL] DAY 44 (0) | 2023.05.16 |
[TIL] DAY 43 (0) | 2023.05.15 |
[WIL] Week 6 (0) | 2023.05.14 |