낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)은 **동시성 제어(concurrency control)**를 위한 두 가지 대표적인 전략입니다. 주로 데이터베이스나 ORM(JPA 등)에서 다중 트랜잭션이 동시에 동일한 데이터를 조작할 때 발생할 수 있는 **경쟁 상태(race condition)**나 데이터 무결성 문제를 방지하기 위해 사용됩니다.
🟢 낙관적 락 (Optimistic Lock)
✅ 개념
- 충돌이 거의 없을 것이라는 전제 하에 동작.
- 트랜잭션 동안 락을 걸지 않고, 최종 커밋 시점에 버전 정보나 타임스탬프를 비교하여 충돌을 감지함.
- 충돌이 나면 커밋을 실패시키고, 예외를 발생시켜 롤백하거나 재시도.
✅ 구현 방식 (JPA 기준)
- @Version 애너테이션을 사용하여 엔티티에 버전 필드 추가.
@Entity
public class Product {
@Id
private Long id;
private String name;
@Version
private Integer version;
}
✅ 장점
- 락을 걸지 않아 병렬성이 높음.
- 읽기 위주의 시스템에 적합.
✅ 단점
- 동시 수정이 잦을 경우 충돌이 자주 발생해 재시도 비용이 발생함.
🔴 비관적 락 (Pessimistic Lock)
✅ 개념
- 충돌이 일어날 가능성이 높다고 가정하고, 데이터를 읽는 순간부터 락을 걸어 다른 트랜잭션의 접근을 차단.
- SELECT FOR UPDATE 같은 SQL 구문을 통해 구현.
✅ 구현 방식 (JPA 기준)
Product product = entityManager.find(Product.class, 1L, LockModeType.PESSIMISTIC_WRITE);
✅ 락 타입
- PESSIMISTIC_READ: 읽기 전용 락.
- PESSIMISTIC_WRITE: 쓰기 락. 다른 트랜잭션이 읽지도 못하게 함.
✅ 장점
- 동시성 충돌을 확실하게 방지함.
- 수정이 빈번한 데이터에 적합.
✅ 단점
- 락을 거는 동안 다른 트랜잭션이 대기해야 하므로 성능 저하 우려.
- 데드락 발생 가능성 존재.
📌 요약 비교
항목 | 낙관적 락 (Optimistic) | 비관적 락 (Pessimistic) |
락 시점 | 커밋 시 충돌 감지 | 데이터 읽는 순간부터 락 |
병행성 | 높음 | 낮음 |
충돌 발생 시 | 예외 발생, 롤백 및 재시도 필요 | 트랜잭션이 대기하거나 실패 |
사용 적합 상황 | 충돌이 드문 경우 | 충돌이 빈번한 경우 |
JPA 사용 방식 | @Version | LockModeType.PESSIMISTIC_* |
'데이터베이스' 카테고리의 다른 글
프로시저에서 로그인 정보 누락 시 유의사항: 아이디가 NULL 또는 공백일 때 발생하는 전체 테이블 스캔 (0) | 2025.05.04 |
---|---|
OPTION (OPTIMIZE FOR UNKNOWN) 완벽 정리 (0) | 2025.05.04 |
PostgreSQL에서 불필요한 인덱스를 찾는 방법 (0) | 2025.03.16 |
PostgreSQL 주의할점 (0) | 2025.03.14 |
PostgreSQL에서 VARCHAR(n)을 작게 설정해도 큰 저장 공간을 차지하는가? (0) | 2025.03.13 |