2026-03-10

동시성 제어

동시성 제어란

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

image.png

 병행 제어 라고도 불리며 한번에 들어온 복수의 트랜잭션을 직렬화 하는 수행을 보장

사용자 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
      • 하나만 가능
  • 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 발생 조건
    1. 상호 배제
    2. 점유 대기
    3. 비선점
    4. 순환 대기

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

results matching ""

    No results matching ""