공유 DB에 동시성 문제 발생시키기
실습 🧙♂️
준비
- Docker를 사용하여 DB 컨테이너 실행하기
- docker-compose.yml
- DB에 접속할 수 있도록 프로젝트 설정하기
- build.gradle
- DB 드라이버 설치
- JPA 라이브러리 설치
- application.yml
- DB 접속 설정
- JPA 설정
- DB 접속 및 프로젝트 정상 실행 확인하기
코드 작성
- 공유 DB 설정하기
- 테이블(Entity) 생성
- 동시성 문제 발생하는 코드 작성하기
- k6로 테스트하기
왜 동시성 문제가 발생할까?
- 공유 변수에서 발생하는 동시성 문제와 같은 이유
- 공유 DB(데이터)의 연산이 원자적으로 이루어 지지 않기 때문
- 트랜잭션 A가 ‘읽기 → 수정 → 쓰기’ 작업을 진행하는 동안 트랜잭션 B도 같은 작업을 수행할 수 있음
- Lost Update 발생!
어떻게 해결할 수 있을까?
syncronized, ReentrantLock
- 트랜잭션 격리 수준 조정(
@Transactional)
- 낙관적 락