데이터베이스 Lock: 공유 락·배타 락, 낙관적 락·비관적 락
Shared Lock과 Exclusive Lock의 차이, 그리고 충돌을 다루는 두 전략인 낙관적 락과 비관적 락을 정리한다.
시리즈 · Database6 / 8
Lock은 여러 트랜잭션이 같은 데이터에 동시에 접근할 때 처리의 순차성을 보장하기 위한 방법이다.
Lock의 종류
Shared Lock(공유 락)
- 데이터를 읽을 때 사용한다.
- Shared Lock끼리는 호환되므로 여러 트랜잭션이 동시에 걸 수 있다.
Exclusive Lock(배타 락)
- 데이터를 변경할 때 사용한다.
- 해제될 때까지 다른 트랜잭션은 해당 데이터에 Shared Lock도 Exclusive Lock도 걸 수 없다.
| 보유 중인 락 \ 요청하는 락 | Shared | Exclusive |
|---|---|---|
| Shared | 허용 | 대기 |
| Exclusive | 대기 | 대기 |
낙관적 락과 비관적 락
Optimistic Lock(낙관적 락)
충돌이 드물다고 가정하고, DB의 락 기능 대신 애플리케이션 레벨에서 충돌을 감지하는 방식이다.
- 테이블에 version 같은 구분 컬럼을 둔다.
- 수정할 때 자신이 읽었던 version을 조건에 넣고, 수정과 함께 version을 올린다.
- 다른 트랜잭션이 먼저 수정했다면 version이 달라져 조건에 맞는 행을 찾지 못하고, 수정이 실패한다.

Pessimistic Lock(비관적 락)
충돌이 일어난다고 가정하고, DB의 락으로 먼저 잠그고 시작하는 방식이다.
- 트랜잭션이 데이터를 읽는 시점에 Shared Lock 또는 Exclusive Lock을 건다.
- 수정하려면 Exclusive Lock을 얻어야 하는데, 다른 트랜잭션이 Shared Lock을 걸고 있으면 얻지 못해 대기한다.
- 즉 해당 데이터를 잡고 있는 다른 트랜잭션이 모두 끝나야 수정할 수 있다.
| 낙관적 락 | 비관적 락 | |
|---|---|---|
| 충돌 처리 | version 등 구분 컬럼으로 감지 | 트랜잭션과 DB 락으로 예방 |
| 구현 위치 | 애플리케이션 | DBMS |
MySQL InnoDB가 실제로 사용하는 잠금은 Real MySQL 8.0 Ch.5 — 트랜잭션과 잠금에서 다룬다.