Lock
1. 낙관적 락 (Optimistic Lock)
특징
- 애플리케이션 레벨에서 관리됨
- 별도의 락을 걸지 않고 트랜잭션 종료 시점에서 데이터 변경 여부를 확인하여 충돌을 감지
- 일반적으로 버전(version) 필드를 사용하여 변경을 감지
- JPA 사용 시 @Version 어노테이션 활용
2. 비관적 락 (Pessimistic Lock)
특징
- 데이터에 접근할 때 즉시 락을 걸어 충돌을 방지
- 락을 거는 방식에 따라 공유 락(S-lock) 과 베타 락(X-lock) 으로 나뉨
공유 락 (Shared Lock, S-Lock)
- 여러 트랜잭션이 동시에 읽기(Read) 가능
- 하지만 쓰기(Write)는 불가능
베타 락 (Exclusive Lock, X-Lock)
- 하나의 트랜잭션만 데이터를 읽고 수정할 수 있음 (다른 트랜잭션 접근 불가)
분산 락 (Distributed Lock)
- 여러 인스턴스가 락을 공유해야 하는 분산 시스템에서 사용
- 락을 DB 자체가 아닌 외부 시스템에서 관리
- Redis, ZooKeeper 등을 활용한 락 관리가 일반적
Lock 단위
락 단위 | 설명 | 특성 |
데이터베이스 | 전체 DB에 락을 거는 방식 | 구현은 간단하지만 병행성이 낮음 |
테이블 | 특정 테이블에 락을 거는 방식 | |
레코드 | 특정 행에만 락을 거는 방식 | 병행성은 높지만 관리가 복잡 |
필드 | 특정 컬럼(필드)에만 락을 거는 방식 |
Blocking vs Deadlock
Blocking (차단)
- 발생 원인
- 하나의 트랜잭션이 베타 락(X-Lock) 을 걸면, 다른 트랜잭션이 해당 데이터를 사용할 수 없어서 대기 상태가 됨
- 트랜잭션이 commit 또는 rollback 될 때까지 대기
- 해결 방법
- 트랜잭션 지속 시간을 짧게 유지
- 동시에 같은 데이터를 갱신하는 트랜잭션이 발생하지 않도록 설계
- LOCK TIMEOUT 설정(특정 시간이 지나면 자동 해제)
Deadlock (교착 상태)
- 발생 원인
- 두 개 이상의 트랜잭션이 서로가 필요한 리소스를 점유한 상태에서 무한 대기
- 해결 방법
- 트랜잭션이 리소스를 요청하는 순서를 동일하게 유지
- 트랜잭션 실행 속도를 빠르게 하여 교착 상태 발생 가능성을 낮춤
- LOCK TIMEOUT 설정하여 특정 시간 후 강제 해제
'자료정리' 카테고리의 다른 글
Redis 기본 개념, 간단한 사용 방식 정리 (0) | 2025.03.27 |
---|