지난 클론코딩 프로젝트에서 예약하기 기능을 구현하고 동시성 문제를 해결하기 위해 몇 가지 방법을 적용한 결과 중 이해가 안 가는 부분이 있었는데 오늘 추가로 학습을 진행하면서 이해하게 된 부분을 정리하고자 한다.
예약하기 메서드를 synchronized 메서드로 만들었을 때 왜 2명 동시 예약이 됐을까??
이 부분에 대해 이해를 하지 못 했었는데 스레드가 임계영역을 탈출하면서 Lock을 반납하고 트랜잭션의 커밋이 이루어지는 사이에, 그 사이에 다른 스레드가 임계영역에 진입해 데이터 조회를 하게 되면 이전 스레드에 의해서 발생한 쿼리문들의 결과가 데이터베이스에 반영이 되지 않은 상황이므로 동일하게 예약이 가능하다고 나오게 되는 것이었다.
나는 트랜잭션의 커밋이 되고 난 후에 메서드가 종료된다고 착각하고 있었는데 실제로는
1. 트랜잭션 시작
2. 비즈니스 로직 실행
3. 트랜잭션 커밋
과 같은 순서를 가지고 있기 때문에 2번과 3번 사이에 다른 스레드가 트랜잭션을 시작해 데이터를 조회할 수가 있는 것이었다.
오늘부터 진행하게 된 실전 프로젝트에서도 동시성 문제를 다루기로 했는데 더 학습하다보면 비관적 락만을 걸었을 땐 왜 데드락이 발생했는지에서도 이해할 수 있을 것 같아 앞으로가 기대된다.
'항해99' 카테고리의 다른 글
[WIL] Week 9 (0) | 2023.06.05 |
---|---|
[WIL] Week 8 (0) | 2023.05.29 |
[TIL] DAY 45 (0) | 2023.05.18 |
[TIL] DAY 44 (0) | 2023.05.16 |
[TIL] DAY 43 (0) | 2023.05.15 |