• database
  • lock
  • transaction

데이터베이스 Lock: 공유 락·배타 락, 낙관적 락·비관적 락

Shared Lock과 Exclusive Lock의 차이, 그리고 충돌을 다루는 두 전략인 낙관적 락과 비관적 락을 정리한다.

시리즈 · Database6 / 8
  1. E/R 모델 설계 원칙 정리
  2. 데이터베이스 키의 종류와 UNIQUE 제약
  3. 인덱스와 B-Tree, 그리고 스캔 방식
  4. JOIN의 종류와 구현 방식
  5. 트랜잭션의 ACID와 DBMS의 복구 전략: UNDO, REDO, WAL
  6. 데이터베이스 Lock: 공유 락·배타 락, 낙관적 락·비관적 락
  7. DB 클러스터링, 레플리케이션, 샤딩과 분산 트랜잭션
  8. PostgreSQL Vacuum 이해와 AutoVacuum 튜닝

Lock은 여러 트랜잭션이 같은 데이터에 동시에 접근할 때 처리의 순차성을 보장하기 위한 방법이다.

Lock의 종류

Shared Lock(공유 락)

  • 데이터를 읽을 때 사용한다.
  • Shared Lock끼리는 호환되므로 여러 트랜잭션이 동시에 걸 수 있다.

Exclusive Lock(배타 락)

  • 데이터를 변경할 때 사용한다.
  • 해제될 때까지 다른 트랜잭션은 해당 데이터에 Shared Lock도 Exclusive Lock도 걸 수 없다.
보유 중인 락 \ 요청하는 락 Shared Exclusive
Shared 허용 대기
Exclusive 대기 대기

낙관적 락과 비관적 락

Optimistic Lock(낙관적 락)

충돌이 드물다고 가정하고, DB의 락 기능 대신 애플리케이션 레벨에서 충돌을 감지하는 방식이다.

  • 테이블에 version 같은 구분 컬럼을 둔다.
  • 수정할 때 자신이 읽었던 version을 조건에 넣고, 수정과 함께 version을 올린다.
  • 다른 트랜잭션이 먼저 수정했다면 version이 달라져 조건에 맞는 행을 찾지 못하고, 수정이 실패한다.

두 요청이 같은 version 1을 읽은 뒤 먼저 도착한 UPDATE만 성공해 version이 2가 되고, 나중 요청은 조건에 맞는 row를 찾지 못하는 낙관적 락 흐름

Pessimistic Lock(비관적 락)

충돌이 일어난다고 가정하고, DB의 락으로 먼저 잠그고 시작하는 방식이다.

  • 트랜잭션이 데이터를 읽는 시점에 Shared Lock 또는 Exclusive Lock을 건다.
  • 수정하려면 Exclusive Lock을 얻어야 하는데, 다른 트랜잭션이 Shared Lock을 걸고 있으면 얻지 못해 대기한다.
  • 즉 해당 데이터를 잡고 있는 다른 트랜잭션이 모두 끝나야 수정할 수 있다.
낙관적 락 비관적 락
충돌 처리 version 등 구분 컬럼으로 감지 트랜잭션과 DB 락으로 예방
구현 위치 애플리케이션 DBMS

MySQL InnoDB가 실제로 사용하는 잠금은 Real MySQL 8.0 Ch.5 — 트랜잭션과 잠금에서 다룬다.