- 동시성이슈 해결방안
- DB의 격리수준과 Write Conflict Detection 정책 활용
- DB의 동시 업데이트 충돌 시 실패 처리 매커니즘을 활용
- 동시성 문제 해결 가능하나, 빈번한 에러 발생
- @Transactional(isolation = Isolation.SERIALIZABLE)를 통한 격리 수준 높이기
- 트랜잭션을 논리적으로 직렬 실행되도록 강제하여 동시성 문제를 근본적으로 차단
- 다만, 성능 저하 및 빈번한 데드락과 에러 발생
- select for update를 통한 배타락 설정
- 특정 row에 대해 명시적 배타 락을 걸어 조회시점부터 lock 설정
- 충돌 범위를 특정 row 단위로 제한하였지만, 여전히 성능 저하 및 에러 발생 가능성 존재
- 싱글 스레드 기반의 redis를 통한 재고관리
- 동시성 문제 해결과 성능 문제 해결 가능
- 다만, 상황에 따라 rdb에 동기화작업을 별도 필요
- 참고)
- syncronized는 동시성 이슈 해결이 되지 못함
- 프로그램 자체에서는 동시성 이슈를 해결할수 있으나 DB에서는 여전히 동시성 문제 발생
- 멀티 서버 환경에서는 spring단의 syncronized가 무효해지는 상황 발생
- 싱글 스레드 기반의 redis를 통한 재고관리 절차
- 상품 등록시 redis에 재고 등록 및 rdb에도 재고 등록
- 사용자로부터 받은 주문 처리시 redis에서 재고 확인후 redis의 재고 감소처리
- RDB 동기화 방법
-
스케쥴러를 통한 주기적 RDB 동기화
-
실시간 RDB 동기화
- 카프카 또는 rabbitmq를 활용한 이벤트 기반 처리

- redis의 재고가 감소하면, 재고 감소 이벤트 큐를 rabbitmq(또는 카프카 등)에 발행
- rabbitmq실행 및 접속
- docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest -e RABBITMQ_DEFAULT_VHOST=/ rabbitmq:3-management
- 스프링 설정
- 스프링이 해당 큐를 listen하게 한 후 rdb 동기화 작업