낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)은 데이터베이스 트랜잭션에서 동시성 제어를 위해 사용되는 대표적인 기법 여러 트랜잭션이 동시에 동일한 데이터에 접근할 때 발생할 수 있는 충돌을 방지하고 데이터 무결성을 보장하는 것이 목적
🔹 낙관적 락 (Optimistic Lock)
- 가정: 데이터 충돌이 자주 발생하지 않는다.
- 데이터를 읽을 때는 락을 걸지 않고 자유롭게 접근한다.
- 트랜잭션이 데이터를 수정하려 할 때, 버전(version) 컬럼이나 타임스탬프 등을 비교해 다른 트랜잭션이 해당 데이터를 변경했는지 확인한다.
- 만약 충돌이 감지되면, 데이터베이스가 아닌 애플리케이션 단에서 롤백하거나 재시도 처리를 수행한다.
- 장점: 락으로 인한 자원 점유가 적어 성능이 우수하다.
- 단점: 충돌 발생 시 재시도 비용이 크다.
🔹 비관적 락 (Pessimistic Lock)
- 가정: 데이터 충돌이 빈번하게 발생한다.
- 트랜잭션이 데이터를 읽거나 수정할 때 즉시 락을 설정한다.
- 공유 락(Shared Lock, S-Lock): 읽기 작업 시 다른 읽기는 허용하지만, 쓰기는 차단한다.
- 베타 락(Exclusive Lock, X-Lock): 쓰기 작업 시 다른 모든 접근(읽기/쓰기)을 차단한다.
- 다른 트랜잭션은 해당 데이터에 접근할 수 없으므로 충돌을 원천적으로 방지한다.
- 장점: 충돌이 거의 발생하지 않는다.
- 단점: 락 점유로 인해 동시성 처리 성능이 떨어지고, 데드락이 발생할 수 있다.
👉 정리하면,
- 낙관적 락은 충돌이 적은 환경에서 성능 최적화에 유리하고,
- 비관적 락은 충돌이 많은 환경에서 데이터 안정성을 보장하는 데 적합
S-Lock과 X-Lock은 다음과 같습니다.
S-Lock: 다른 트랜잭션에서 읽기는 가능하지만 쓰기는 불가능합니다.
X-Lock: 다른 트랜잭션에서 읽기, 쓰기 모두 불가능합니다.
cf. MySQL은 일관된 읽기(Consistent Nonlocking Reads)를 지원하여 X-Lock이 걸려있어도 단순 SELECT로 읽을 수 있습니다.
두 방식의 차이점?
구분 낙관적 락 (Optimistic Lock) 비관적 락 (Pessimistic Lock)
| 가정 | 충돌이 적을 것이라 가정 | 충돌이 많을 것이라 가정 |
| 락 사용 여부 | DB 락을 걸지 않음 | 트랜잭션 시작 시 DB 락 설정 |
| 처리 방식 | 충돌 시 버전 체크 후 롤백·재시도 | 충돌 자체를 차단 (대기 발생) |
| 성능 | 락이 없어 빠르지만 충돌 시 성능 저하 가능 | 안정적이지만 동시성 처리 성능 저하 |
| 사용 사례 | 읽기 위주, 충돌이 드문 환경 | 쓰기/갱신이 빈번하고 충돌 가능성이 높은 환경 |
요약
낙관적 락은 충돌이 적을 것으로 가정하고 데이터를 수정할 때만 충돌 여부를 확인하는 방식으로, 성능에 유리하지만 충돌 시 재시도 비용이 발생합니다. 반면, 비관적 락은 충돌이 잦을 것으로 가정하고 트랜잭션 시작 시점에 락을 걸어 다른 접근을 차단하는 방식으로, 안정성은 높지만 동시성 처리 성능이 떨어질 수 있습니다. 따라서 환경에 따라 성능 중심이면 낙관적 락, 안정성 중심이면 비관적 락이 적합합니다.
출처 : 매일매일
'Dev > Computer Science' 카테고리의 다른 글
| [CS] 프로그래밍 기본 개념 시험문제 요약 (0) | 2026.04.16 |
|---|---|
| [CS] 트랜잭션 예외 처리 정리 | Checked Exception, Unchecked Exception (0) | 2025.09.11 |
| [CS] RestfulAPI 설계와 적용방법 알아보기 (2) | 2025.08.05 |
| [CS] 회선(서킷) 교환 방식 VS 패킷 교환 방식 (0) | 2025.07.27 |
| [CS ] CSRF 공격 (2) | 2025.06.24 |