2026-03-10
동시성 제어
동시성 제어란
여러 트랜잭션이 동시에 데이터에 접근할 때 데이터의 일관성을 유지하도록 제어하는 기술

병행 제어 라고도 불리며 한번에 들어온 복수의 트랜잭션을 직렬화 하는 수행을 보장
사용자 A: 계좌 조회
사용자 B: 계좌 송금
동시에 처리되면 데이터 충돌 가능
⇒ 동시성 제어 필요
동시성 문제 (면접 단골)
- Dirty Read
커밋되지 않은 데이터를 읽는 문제
T1: 값 변경 (아직 commit 안함) T2: 그 값 읽음 T1: rollback⇒ 잘못된 데이터 읽음
- Non-repeatable Read
같은 데이터를 두 번 읽었는데 값이 달라짐
T1: 데이터 읽음 T2: 데이터 수정 T1: 다시 읽음 → 값 변경 - Phantom Read
같은 조건으로 조회했는데 행 수가 달라짐
SELECT * FROM users WHERE age > 20조회 후 다른 트랜잭션이 데이터 추가 ⇒ 결과 행 증가
동시성 제어 방법
- Lock 기반 제어 (가장 기본적인 방식)
- Shared Lock (S Lock)
읽기 Lock
- 여러 트랜잭션 동시에 가능
- Exclusive Lock (X Lock)
쓰기 Lock
- 하나만 가능
- Shared Lock (S Lock)
읽기 Lock
- Optimistic Lock (낙관적 락)
충돌이 거의 없다고 가정 방법 → 버전 번호 사용
version = 1업데이트 시
WHERE version = 1실패하면 재시도 주로 JPA, REST API 에서 사용
- Pessimistic Lock (비관적 락)
충돌이 발생한다고 가정 데이터 접근 시 ⇒ Lock 먼저 획득 예
SELECT ... FOR UPDATE
Deadlock (데드락)
두 트랜잭션이 서로 Lock을 기다리는 상태
예
T1: A Lock → B Lock 대기
T2: B Lock → A Lock 대기
⇒ 무한 대기
- Deadlock 발생 조건
- 상호 배제
- 점유 대기
- 비선점
- 순환 대기
DB에서 동시성 제어 방법
- MVCC (Multi Version Concurrency Control)
여러 버전의 데이터를 관리
대표 DB
- MySQL
- PostgreSQL 장점: 읽기 성능 향상
Spring / JPA 동시성 제어
- Optimistic Lock
@Version - Pessimistic Lock
@Lock(LockModeType.PESSIMISTIC_WRITE)
참고자료
- https://s-y-130.tistory.com/232
- https://velog.io/@choidongkuen/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4Concurrency-Controll
- https://wikidocs.net/287926
- https://namji9507.tistory.com/entry/Database-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4%EB%9E%80