2단계 로킹
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
2단계 로킹(Two-Phase Locking, 2PL)은 데이터베이스에서 트랜잭션의 직렬 가능성을 보장하기 위한 병행 제어 프로토콜이다. 각 트랜잭션은 락을 획득하는 확장 단계와 락을 해제하는 축소 단계를 거치며, 락을 해제한 후에는 추가 락을 획득할 수 없다. 2PL에는 읽기 락(공유 락)과 쓰기 락(배타적 락)이 사용되며, 락 호환성 테이블에 따라 락의 종류와 사용 방식이 결정된다. 2PL은 엄격 2단계 로킹(Strict 2PL), 강력 엄격 2단계 로킹(SS2PL), 보수적 2단계 로킹(C2PL) 등 다양한 변형이 존재하며, 각 변형은 충돌 직렬화, 뷰 직렬화, 교착 상태 방지, 회복 가능성, 엄격성, 팬텀 리드 방지 및 더티 리드 방지 등에서 차이를 보인다. 2PL은 직렬 가능성을 보장하지만, 교착 상태를 완전히 방지하지 못하며, 교착 상태 발생 시 탐지 및 롤백과 같은 해결책이 필요하다.
더 읽어볼만한 페이지
- 동시성 제어 - 세마포어
세마포어는 데이크스트라가 고안한 정수 변수로, P/V 연산을 통해 자원 접근을 제어하고 동기화 문제를 해결하며, 계수 세마포어와 이진 세마포어로 나뉘어 멀티스레드 환경에서 자원 관리 및 스레드 동기화에 기여한다. - 동시성 제어 - 모니터 (동기화)
모니터는 공유 자원 접근을 제어하여 프로세스 간 동기화를 구현하는 프로그래밍 구조로, 뮤텍스 락, 조건 변수 등으로 구성되어 경쟁 상태를 방지하며 여러 프로그래밍 언어에서 지원된다. - 트랜잭션 처리 - 2단계 커밋 프로토콜
2단계 커밋 프로토콜은 분산 컴퓨팅 환경에서 트랜잭션의 원자성을 보장하는 분산 알고리즘으로, 조정자와 참가자로 구성되어 모든 참가자가 트랜잭션을 완료하거나 아무도 완료하지 못하도록 하며, 커밋 요청 및 커밋 단계를 거쳐 모든 참가자의 동의를 얻어야 커밋된다. - 트랜잭션 처리 - 온라인 트랜잭션 처리
온라인 트랜잭션 처리(OLTP)는 실시간 데이터베이스 트랜잭션 처리 방식으로, 가용성, 속도, 동시성, 내구성을 목표로 은행, 항공사, 전자 상거래 등에서 활용된다. - 데이터베이스 - 지식 베이스
지식 베이스는 특정 주제 정보를 체계적으로 저장 및 관리하며 규칙 기반 추론으로 새로운 지식 도출에 활용되고, 웹 콘텐츠 관리 및 지식 관리 시스템으로 확장되어 온톨로지를 이용, 인공지능 기술과 결합하여 문제 해결책을 제시하고 경험을 통해 학습하는 시스템이다. - 데이터베이스 - 화이트리스트
화이트리스트는 특정 대상만 허용하고 나머지는 차단하는 접근 제어 목록으로, 정보보안, 무역, 금융 등 다양한 분야에서 활용되지만, 목록 선정 기준의 불명확성, 사회적 문제점 등의 위험성으로 투명하고 엄격한 관리가 필요하다.
2단계 로킹 |
---|
2. 2단계 로킹의 기본 원리
2단계 로킹 프로토콜에 따르면 각 트랜잭션은 실행 중에 락을 획득하고 해제하는 과정을 두 단계로 나눈다.[1]
# '''확장 단계''': 락을 획득만 할 수 있고, 해제는 할 수 없다.
# '''축소 단계''': 락을 해제만 할 수 있고, 획득은 할 수 없다.
2단계 로킹의 핵심 규칙은 트랜잭션이 한 번 락을 해제하기 시작하면, 그 후에는 새로운 락을 획득할 수 없다는 것이다. 이 규칙을 따르면 직렬 가능성이 보장된다. 일반적으로 트랜잭션이 처리를 완료하고 커밋을 요청할 때, 모든 락을 한 번에 해제한다.
엄격한 2단계 로킹(Strict 2PL)은 캐스케이딩 롤백(트랜잭션 중단으로 인해 발생하는 롤백이 여러 트랜잭션을 연쇄적으로 중단시키는 현상)을 방지한다. 이는 쓰기 연산을 할 때 필요한 배타적 락을 트랜잭션이 커밋될 때까지 유지하기 때문이다.
2. 1. 읽기 락과 쓰기 락
2단계 로킹(2PL)에서는 트랜잭션이 데이터를 읽거나 쓰기 위해 해당 데이터에 대한 락을 획득해야 한다. 2PL은 읽기 락(공유 락)과 쓰기 락(배타적 락)의 두 가지 유형의 락을 사용한다.- 트랜잭션은 해당 객체에 대해 읽기 락 또는 쓰기 락을 보유하고 있는 경우에만 해당 객체를 읽을 수 있다.
- 트랜잭션은 해당 객체에 대해 쓰기 락을 보유하고 있는 경우에만 해당 객체를 쓸 수 있다.
- 여러 트랜잭션이 동일한 객체에 대해 동시에 락을 보유할 수 있지만, 이 락들 중 쓰기 락이 없어야 한다. 만약 허용되지 않는 락을 동시에 보유하려 하면 해당 트랜잭션은 차단된다.
락 유형 | 읽기 락 | 쓰기 락 |
---|---|---|
읽기 락 | ✔ | X |
쓰기 락 | X | X |
2. 2. 락 호환성
읽기 락 | 쓰기 락 | |
---|---|---|
읽기 락 | ✔ | X |
쓰기 락 | X | X |
읽기 락은 다른 읽기 락과 호환되지만, 쓰기 락과는 호환되지 않는다. 쓰기 락은 다른 어떤 락과도 호환되지 않는다.
2. 3. 확장 단계와 축소 단계
2단계 로킹 프로토콜에서 각 트랜잭션은 락 획득 및 해제를 두 단계로 처리한다.- 확장 단계 (Growing Phase): 트랜잭션은 필요한 락을 획득할 수 있지만, 락을 해제할 수는 없다.
- 축소 단계 (Shrinking Phase): 트랜잭션은 획득한 락을 해제할 수 있지만, 새로운 락을 획득할 수는 없다.
트랜잭션이 락을 해제한 후에는 새로운 락을 획득할 수 없다는 규칙을 지키면 직렬 가능성이 보장된다. 일반적으로 트랜잭션이 처리를 완료하고 커밋을 요청하는 시점에 모든 락을 한 번에 해제한다(2단계).
3. 2단계 로킹의 변형
2단계 로킹(2PL)은 다양한 변형이 존재하며, 대표적으로 엄격한 2단계 로킹(S2PL), 강력한 엄격한 2단계 로킹(SS2PL), 보수적 2단계 로킹(C2PL)이 있다.
충돌 직렬화 보장 | 뷰 직렬화 보장 | 교착 상태 제거 | 회복 가능성 보장 | 엄격성 보장 | 팬텀 리드 방지 | 더티 리드 방지 | |
---|---|---|---|---|---|---|---|
2단계 로킹(2PL) | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 |
제약 2단계 로킹(C2PL) | 예 | 예 | 예 | 예 | 예 | 아니요 | 예 |
엄격 2단계 로킹(S2PL) | 예 | 아니요 | 아니요 | 예 | 예 | 예 | 예 |
강력 엄격 2단계 로킹(SS2PL) | 예 | 아니요 | 아니요 | 예 | 예 | 예 | 예 |
- 엄격한 2단계 로킹 (Strict 2PL, S2PL): 트랜잭션 종료(커밋 또는 롤백) 전까지 쓰기 락을 해제하지 않는다. 읽기 락은 축소 단계에서 해제 가능하다. 엄격성을 보장하지만, B-트리에는 부적합하다.
- 강력한 엄격한 2단계 로킹 (Strong Strict 2PL, SS2PL): 트랜잭션 종료 시까지 읽기/쓰기 락을 모두 유지한다. 락 획득 단계만 존재한다.
- 보수적 2단계 로킹 (Conservative 2PL, C2PL): 트랜잭션 시작 전 모든 락을 획득하여 교착 상태를 방지한다. 락 충돌이 높으면 성능이 좋지만, 낮으면 불필요한 락으로 오버헤드가 발생한다.
3. 1. 엄격한 2단계 로킹 (Strict 2PL, S2PL)
엄격한 2단계 로킹(Strict 2PL, S2PL)은 2PL의 한 종류로, 트랜잭션이 종료(커밋 또는 롤백)될 때까지 쓰기 락(배타적 락)을 해제하지 않는 방식이다. 읽기 락(공유 락)은 축소 단계에서 일반적인 2PL처럼 해제할 수 있다.S2PL은 엄격성을 보장하여 연쇄 복구 불가능성(cascadeless recoverability)을 만족시킨다. 하지만 B-트리에는 적합하지 않은데, B-트리는 항상 부모 루트에서 검색을 시작하므로 병목 현상을 유발하기 때문이다.[1]
S2PL은 다음 두 가지 규칙을 따른다.
# 트랜잭션 T가 어떤 객체를 읽거나 쓸 때, 해당 객체에 공유/배타적 락을 사용해야 한다.
# 트랜잭션 T가 건 모든 배타적 락은 T가 커밋될 때 해제된다(커밋 전에는 해제되지 않는다).
다음은 S2PL의 예시다.
:
텍스트 표현:
T1: S(A), R(A); T2: S(A), R(A), X(B), R(B), W(B), Commit; T1: X(C), R(C), W(C), Commit
- S(O): 객체 O에 대한 공유(Shared) 락 연산
- X(O): 객체 O에 대한 배타적(eXclusive) 락 연산
- R(O): 객체 O에 대한 읽기(Read) 연산
- W(O): 객체 O에 대한 쓰기(Write) 연산
S2PL은 커밋되지 않은 데이터를 읽거나 갱신하는 것, 읽기와 쓰기의 충돌을 방지한다. 따라서 캐스케이딩 롤백(트랜잭션 중단으로 인해 발생하는 롤백이 여러 트랜잭션을 연쇄적으로 롤백시키는 현상)도 방지한다. 이는 쓰기 연산을 막는 배타적 락을 트랜잭션 커밋 시까지 유지하기 때문이다.
S2PL에서도 교착 상태는 발생할 수 있다.
:
텍스트 표현: T1: X(A) T2:X(B) T1:X(B) T2: X(A)
위 예시에서 T1은 T2가 B에 건 락을 해제하기를 기다리고, T2는 T1이 A에 건 락을 해제하기를 기다린다. 두 트랜잭션 모두 더 이상 진행할 수 없어 교착 상태가 된다.
교착 상태 문제에 대한 일반적인 해결책은 없다. 따라서 상황에 따라 "은행원 알고리즘"이나 "락 획득 순서 설정"과 같은 방법으로 교착 상태를 예방하거나 대처해야 한다.
분산 데이터베이스나 다중화된 결함 허용 시스템에서는 교착 상태를 처리하기 더 어려울 것이다.
많은 데이터베이스 시스템이 Strict 2PL을 사용한다.
3. 2. 강력한 엄격한 2단계 로킹 (Strong Strict 2PL, SS2PL)
강력한 엄격한 2단계 로킹(Strong Strict 2PL, SS2PL)은 트랜잭션이 종료될 때까지 읽기 락과 쓰기 락을 모두 해제하지 않는 로킹 방식이다. SS2PL을 따르는 트랜잭션은 락을 획득하는 위상 1만 존재하며, 트랜잭션이 완료될 때까지 락을 해제하는 위상 2는 없다. 모든 SS2PL 스케줄은 엄격 2단계 로킹(S2PL) 스케줄이지만, 그 반대는 성립하지 않는다.SS2PL은 엄격성(strictness) 또는 엄격한 스케줄링이라고도 불린다.
충돌 직렬화 보장 | 뷰 직렬화 보장 | 교착 상태 제거 | 회복 가능성 보장 | 엄격성 보장 | 팬텀 리드 방지 | 더티 리드 방지 |
---|---|---|---|---|---|---|
예 | 아니요 | 아니요 | 예 | 예 | 예 | 예 |
3. 3. 보수적 2단계 로킹 (Conservative 2PL, C2PL)
보수적 2단계 로킹(Conservative two-phase locking, C2PL)은 트랜잭션이 시작되기 전에 필요한 모든 잠금(Lock)을 획득한다는 점에서 2단계 로킹(2PL)과 다르다. 이는 이미 일부 잠금을 보유하고 있는 트랜잭션이 다른 잠금을 기다리면서 블로킹되지 않도록 하기 위한 것이다. C2PL은 교착 상태를 ''방지''한다.높은 잠금 자원 경합의 경우, C2PL은 2PL 및 엄격한 2PL에 비해 평균적으로 잠금이 유지되는 시간을 줄인다. 이는 잠금을 보유한 트랜잭션이 절대 블로킹되지 않기 때문이다. 낮은 잠금 경합의 경우, C2PL은 불필요한 잠금을 더 많이 보유한다. 이는 미래에 어떤 잠금이 필요할지 예측하기 어렵기 때문이며, 따라서 오버헤드가 더 커진다.
C2PL 트랜잭션은 초기 요청에서 필요한 모든 잠금을 획득할 수 없는 경우 어떠한 잠금도 획득하지 않는다. 또한, 각 트랜잭션은 읽기 및 쓰기 집합(읽기/쓰기될 데이터 항목)을 선언해야 하는데, 이것이 항상 가능한 것은 아니다. 이러한 제약으로 인해 C2PL은 그다지 자주 사용되지 않는다.
4. 2단계 로킹과 교착 상태
2PL은 직렬 가능성을 보장하지만, 교착 상태를 완벽하게 방지하지는 못한다. 2PL의 변형인 보수적 2단계 로킹(C2PL)은 교착 상태를 방지할 수 있는데, 트랜잭션이 시작되기 전에 필요한 모든 잠금을 획득하도록 하여, 트랜잭션이 이미 일부 잠금을 보유하고 있는 상태에서 다른 잠금을 기다리며 블로킹되는 상황을 방지한다.
높은 잠금 자원 경합 환경에서 C2PL은 잠금을 보유한 트랜잭션이 블로킹되지 않기 때문에 2PL 및 엄격한 2PL에 비해 평균 잠금 유지 시간을 줄인다. 그러나 낮은 잠금 경합 환경에서는 C2PL이 불필요한 잠금을 더 많이 보유하게 되어 오버헤드가 커질 수 있다. C2PL 트랜잭션은 초기 요청에서 필요한 모든 잠금을 획득할 수 없는 경우 어떠한 잠금도 획득하지 않으며, 각 트랜잭션은 읽기 및 쓰기 집합을 선언해야 하는데, 이는 항상 가능한 것은 아니다. 이러한 제약으로 인해 C2PL은 자주 사용되지 않는다.
4. 1. 교착 상태 발생 예시
두 트랜잭션 T1과 T2가 있을 때, 다음과 같은 상황에서 교착 상태가 발생할 수 있다.T1 | T2 |
---|---|
X(A) | |
X(B) | |
X(B) | |
X(A) |
- X(O)는 객체 O에 대한 배타적(eXclusive) 락 연산이다.
T1은 T2가 B에 건 락이 해제되기를 기다리고, T2는 T1이 A에 건 락이 해제되기를 기다린다. 두 트랜잭션은 더 이상 진행할 수 없으며, 둘 다 교착 상태가 된다.
4. 2. 교착 상태 해결
교착 상태 문제에 대한 범용적인 해결책은 존재하지 않는다. 일반적으로 교착 상태를 탐지하고, 교착 상태에 빠진 트랜잭션 중 하나를 롤백시키는 방식으로 해결한다. 은행원 알고리즘이나 "락 획득 순서 설정"과 같은 방법으로 교착 상태를 예방할 수도 있다.5. 2단계 로킹의 장단점
2단계 로킹(2PL)은 직렬 가능성을 보장하고 충돌 직렬 가능 스케줄을 허용한다는 장점이 있지만, 교착 상태를 발생시킬 수 있다는 단점이 있다.
엄격한 2단계 로킹(Strict 2PL, S2PL)은 엄격성을 제공하지만, B-트리에서는 병목 현상을 유발할 수 있다. 강력한 엄격한 2단계 로킹(Strong Strict 2PL, SS2PL)은 S2PL보다 더 엄격한 제약을 가한다.
보수적 2단계 로킹(Conservative 2PL, C2PL)은 교착 상태를 방지하지만, 락 충돌이 적은 환경에서는 오버헤드가 높고, 트랜잭션이 필요로 하는 모든 데이터를 미리 선언해야 하는 제약이 있어 자주 사용되지 않는다.
5. 1. 장점
2단계 로킹(2PL) 프로토콜은 트랜잭션이 락을 획득하고 해제하는 과정을 두 단계로 나누어 처리함으로써 직렬 가능성을 보장한다. 2PL은 다음과 같은 장점을 가진다.- 직렬 가능성 보장: 2PL을 사용하는 트랜잭션 스케줄은 직렬 가능성을 보장한다. 즉, 여러 트랜잭션이 동시에 실행되더라도 마치 순차적으로 실행되는 것과 같은 결과를 얻을 수 있다.
- 충돌 직렬 가능 스케줄 허용: 2PL은 충돌 직렬 가능한 스케줄만 허용하여 데이터 일관성을 유지한다.
보수적 2단계 로킹(C2PL)은 트랜잭션 시작 전에 필요한 모든 락을 획득하여 교착 상태를 방지한다. C2PL은 다음과 같은 장점을 가진다.
- 교착 상태 방지: 트랜잭션 실행 중 락 획득으로 인한 교착 상태 발생을 원천적으로 차단한다.
- 평균 락 획득 기간 단축 (락 충돌 심한 경우): 락 충돌이 심한 환경에서는 트랜잭션이 도중에 차단되지 않으므로 2PL이나 엄격한 2PL보다 평균 락 획득 시간을 줄일 수 있다.
5. 2. 단점
2단계 로킹(2PL)은 교착 상태를 발생시킬 수 있다. 엄격한 2단계 로킹(Strict 2PL) 환경에서 교착 상태는 다음과 같이 발생한다.:
텍스트로는 다음과 같다.
T1: X(A) T2:X(B) T1:X(B) T2: X(A)
T1은 T2가 B에 건 락이 해제되기를 기다리고, T2는 T1이 A에 건 락이 해제되기를 기다린다. 두 트랜잭션은 더 이상 진행할 수 없으며, 둘 다 교착 상태가 된다.
교착 상태 문제에 대한 범용적인 해결책은 존재하지 않는다. 따라서 상황에 따라 예방하거나 대처해야 한다. "은행원 알고리즘"이나 "락 획득 순서 설정"과 같은 대책으로 교착 상태를 방지할 수도 있다.
보수적 2단계 로킹(C2PL)은 교착 상태를 방지한다. 2단계 로킹과 C2PL의 차이점은 C2PL이 트랜잭션 시작 전에 필요한 모든 락을 획득한다는 점이다. 이로 인해 트랜잭션 도중에 락을 획득하려다 교착 상태가 발생하는 것을 방지한다.
록 충돌이 심한 상황에서는 C2PL에서의 트랜잭션이 도중에 블록되지 않으므로, 2단계 로킹이나 엄격한 2단계 로킹에 비해 평균 락 획득 기간을 줄일 수 있다.
록 충돌이 적은 상황에서는 C2PL은 필요 이상으로 락을 획득하므로 오버헤드가 높아진다.
또한, 트랜잭션은 필요한 락을 모두 획득할 때까지 어떤 락도 획득하지 않으며, 처리도 시작할 수 없다. 게다가 트랜잭션마다 읽거나 쓸 데이터를 모두 선언해야 하며, 이는 항상 가능하다고 할 수 없다. 이러한 제한 때문에 C2PL은 많이 사용되지 않는다.
참조
[1]
서적
Concurrency Control and Recovery in Database Systems
http://research.micr[...]
Addison Wesley Publishing Company
1987
[2]
서적
Transactional Information Systems
http://www.elsevier.[...]
Elsevier
2001
[3]
서적
Concurrency Control and Recovery in Database Systems
http://research.micr[...]
Addison Wesley Publishing Company
1987
[4]
서적
Transactional Information Systems
http://www.elsevier.[...]
Elsevier
2001
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com