1. 공유 락 (Shared Lock, S-Lock)
예시:
트랜잭션 A와 B가 동시에 특정 데이터를 읽는 작업을 수행할 때, 공유 락을 사용하여 데이터의 일관성을 유지합니다.
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
2. 배타 락 (Exclusive Lock, X-Lock)
예시:
트랜잭션 A가 특정 데이터를 수정할 때 배타 락을 걸면, 트랜잭션 B는 해당 데이터에 접근할 수 없습니다.
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
데드락(Deadlock):
두 개 이상의 트랜잭션이 서로가 점유한 자원의 락 해제를 기다리며 무한 대기 상태에 빠지는 현상.
발생 상황 예시:
1. 트랜잭션 A가 자원 X에 배타 락을 걸고, 자원 Y에 락을 요청.
2. 동시에 트랜잭션 B가 자원 Y에 배타 락을 걸고, 자원 X에 락을 요청.
3. A는 B가 점유한 자원 Y를 기다리고, B는 A가 점유한 자원 X를 기다리면서 데드락 발생.
예방(Prevention)
데드락이 발생하지 않도록 사전에 차단하는 방법.
회피(Avoidance)
시스템이 실시간으로 자원 상태를 분석하고, 데드락이 발생할 가능성이 있는 경우 자원 할당을 피하는 방법.
검출(Detection) 및 복구(Recovery)
데드락이 발생했는지 주기적으로 검사하고, 발생 시 복구하는 방법.
낙관적 동시성 제어(Optimistic Concurrency Control)
트랜잭션 간 충돌 가능성이 낮은 경우, 락을 사용하지 않고 작업을 진행하며 충돌 발생 시 롤백.
1. 읽기 작업
Consistent Nonlocking Reads
)의 경우 읽기가 가능하지만, 락을 사용하는 읽기(Locking Reads
)에서는 불가능합니다.2. 쓰기 작업
공유 락과 배타 락의 동작 방식은 트랜잭션의 격리 수준에 따라 달라집니다.
트랜잭션 격리 수준은 트랜잭션 간 데이터 충돌을 방지하는 정도를 정의하며,
공유 락과 배타 락의 동작 방식을 결정짓는 중요한 요소입니다.
Read Uncommitted:
배타 락 없이 데이터를 읽습니다.
읽기 락 없이 쓰기가 진행될 수 있어 Dirty Read가 발생할 수 있습니다.
Read Committed:
데이터를 읽을 때 공유 락이 설정됩니다.
쓰기 중인 데이터를 읽지 않도록 보호합니다.
Repeatable Read:
데이터를 읽을 때 공유 락을 설정하여 읽기 일관성을 보장합니다.
동시에 배타 락을 설정하여 쓰기를 방지합니다.
Serializable:
가장 높은 격리 수준으로, 공유 락과 배타 락을 모두 엄격히 사용하여 완벽한 트랜잭션 고립을 보장합니다.
추가 학습 자료