트랜잭션 동시성 제어와 락의 필요성
데이터베이스에서 트랜잭션이 동시에 실행될 경우, 데이터 일관성과 무결성을 보장하기 위해 락 메커니즘이 필수적이다. 대표적인 락은 공유 락(Shared Lock)과 배타 락(Exclusive Lock)이다.
공유 락 (Shared Lock)
- 읽기 락(Read Lock)이라고도 한다.
- 여러 트랜잭션이 동시에 같은 데이터를 읽을 수 있음.
- 그러나 쓰기 작업은 허용되지 않음.
- 트랜잭션이 커밋되거나 롤백되기 전까지 락이 유지된다.
- 조회한 데이터가 중간에 변경되지 않도록 보장한다.
SQL 예시:
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
배타 락 (Exclusive Lock)
- 쓰기 락(Write Lock)이라고도 한다.
- 락을 획득한 트랜잭션만 데이터에 접근 가능 (읽기 및 쓰기 모두).
- 다른 트랜잭션은 어떠한 락도 획득할 수 없다.
- 데이터 수정, 삭제, 삽입 시 충돌을 방지한다.
SQL 예시:
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
공유 락 vs 배타 락 비교
구분 | 공유 락 (Read Lock) | 배타 락 (Write Lock) |
---|---|---|
동시 읽기 | 가능 | 불가능 |
동시 쓰기 | 불가능 | 불가능 |
주요 목적 | 조회 중 데이터 보호 | 데이터 수정 시 독점 확보 |
충돌 시 | 배타 락 요청은 대기 | 모든 락 요청 대기 |
데드 락 (Dead Lock)
- 두 개 이상의 트랜잭션이 서로가 가진 자원을 기다리며 무한 대기하는 상태.
- 다음과 같은 순서로 발생한다:
- 트랜잭션 A가 id=1에 공유 락을 보유
- 트랜잭션 B가 id=2에 공유 락을 보유
- A가 id=2에 배타 락 요청 → B의 락 해제를 기다림
- B가 id=1에 배타 락 요청 → A의 락 해제를 기다림
결과: 서로가 서로의 락을 기다리는 교착 상태
데드 락 해결 전략
- 락 획득 순서를 일관되게 유지
- 락 타임아웃 설정: 일정 시간 대기 후 트랜잭션 자동 롤백
- DBMS의 교착 탐지 기능 사용:
- 주기적으로 데드 락 스캔
- 희생 트랜잭션을 선택해 롤백
결론
- 공유 락은 동시 읽기 성능을 보장하면서 데이터 무결성을 유지한다.
- 배타 락은 수정 작업의 안정성을 보장한다.
- 데드 락을 예방하려면 락 획득 순서, 타임아웃, 탐지 기능 등을 적극 활용해야 한다.
'지식저장소' 카테고리의 다른 글
JPA의 N + 1 (0) | 2025.04.01 |
---|---|
엔티티 매니저에 대하여 (0) | 2025.03.28 |
Spring Data JPA에서 새로운 Entity인지 판단하는 방법은? (0) | 2025.03.26 |
카프카 알아보기 (0) | 2025.02.17 |
정적 팩토리 메서드란? (0) | 2024.11.19 |