교착 상태 처리
- 잠금 기반 규약의 단점
아래의 스케줄을 살펴보면,
lock-S(B)는 T4가 T3가 B에 대한 lock을 해제하기를 기다리도록 하고,
lock-X(A)는 T3이 T4가 A에 대한 lock을 해제하기를 기다리도록 한다.
따라서 T3와 T4는 더 이상 진행되지 못하고 무한히 기다리는 교착 상태(dead lock)에 빠지게 된다.
또한 잠금 기반 규약은 기아(starvation) 현상이 발생할 수 있다.
이는 aging 기법을 사용해서 해결할 수 있다.
- 교착 상태 예방
교착 상태를 예방하는 한 가지 방법으로 timeout-based schemes가 있다.
이는 lock을 요청한 트랜잭션이 일정한 시간 동안 기다리다가, 그 시간 안에 lock을 얻지 못하면 스스로 롤백해서 다시 시작하는 방법이다.
따라서 교착 상태에 빠지는 것이 불가능하다.
이 방법의 장점은 구현하기 쉽다는 것이고,
단점은 기아(starvation) 현상이 발생할 수 있고, 적당한 timeout의 크기를 정하는 것이 어렵다는 것이다.
다중 세분도(Multiple Granularity)
지금까지는 동시성 제어 기법에서 개별 데이터 항목을 동기화를 수행하는 단위로 사용했다. (record(row) 단위)
이는 수많은 lock을 걸어야 할 때, 많은 시간을 필요로 한다.
이는 굉장히 비효율적이다.
따라서 데이터베이스 시스템이 lock을 시행하는 데 여러 단계의 세분도(granularity)를 제공할 필요가 있다.
이는 데이터 항목을 다양한 크기로 만들고 데이터 세분도의 계층을 정의함으로써 가능하다.
이러한 계층은 트리로 나타낼 수 있다.
트랜잭션이 한 노드에 명시적으로 lock을 걸었다면, 그 노드의 모든 자손들이 같은 모드의 lock을 암묵적으로 가지게 된다.
낮은 level에 lock을 걸면, 동시성이 높아지지만 locking의 overhead가 커진다.(fine granularity)
반면 높은 lovel에 lock을 걸면, 동시성이 낮아지지만 locking의 overhead가 작아진다.(coarse granularity)
따라서 동시성(concurrency)과 overhead는 trade-off 관계를 가진다.
예시)
위의 트리는 네 개의 단계로 이루어져 있다.
1. database
2. area
3. file
4. record
한 트랜잭션이 한 노드에 lock을 걸려고 할 때, 시스템은 해당 노드에 lock을 걸 수 있는지 없는지 판단할 수 있어야 한다.
이를 판단하는 한 가지 방법은 전체 트리를 탐색하는 것인데, 이는 다중 세분도 잠금 기법의 목적을 위배하는 것이다.
따라서 의도 잠금 모드(intention lock mode)라 불리는 새로운 형태의 잠금 모드를 이용해 이를 판단하게 된다.
세 가지의 새로운 의도 잠금 모드가 존재한다.
1. intention-shared(IS) 모드:
그 노드가 포함된 단계보다 낮은 단계에서 명시적으로 S(shared) 모드로 lock이 걸려 있다는 것을 의미한다.
2. intention-exclusive(IX) 모드:
그 노드가 포함된 단계보다 낮은 단계에서 명시적으로 X(exclusive) 모드로 lock이 걸려 있다는 것을 의미한다.
3. shared and intention-exclusive(SIX) 모드:
그 노드를 루트로 하는 서브 트리에 명시적으로 S 모드의 lock이 걸리고, 그 노드를 포함하는 단계보다 낮은 단계에는 X 모드로 lock이 걸리게 된다.
의도 잠금 모드를 포함한 호환성 관계 행렬은 다음과 같다.
다중 세분도 잠금 규약(multiple-granularity locking protocol)은 직렬 가능성을 보장하기 위해서 다음의 규칙을 사용한다.
노드 Q에 잠금을 걸려고 시도하는 트랜잭션에 대해,
트랜잭션은 위의 잠금 호환성 관계 행렬을 따라야 한다.
트리의 루트는 먼저 lock이 걸려야 하고, 어떤 모드로도 lock이 걸릴 수 있다.
트랜잭션은 현재 Q의 부모가 IX나 IS로 lock이 걸려있는 경우에만, 노드 Q를 S 또는 IS 모드로 lock을 걸 수 있다.
트랜잭션은 현재 Q의 부모가 IX나 SIX로 lock이 걸려있는 경우에만, 노드 Q를 X, SIX 또는 IX모드로 lock을 걸 수 있다.
=> Q의 부모: Q
IS, IX: S, IS
IX, SIX: X, IX
IX: SIX
트랜잭션은 이전에 어떠한 lock도 해제하지 않았을 때만 노드에 lock을 걸 수 있다.
(2단계 잠금 규약을 따를 때)
트랜잭션은 Q의 자손 중 하나라도 잠금이 걸려있지 않아야 Q의 lock을 해제할 수 있다.
(lock은 하향식으로 일어나고, unlock은 상향식으로 일어난다.)
'전공 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 질의 처리와 최적화 - (1) (0) | 2021.12.13 |
---|---|
[데이터베이스] 동시성 제어 - (1) (0) | 2021.12.12 |
[데이터베이스] 복구 시스템 - (3) (0) | 2021.12.12 |
[데이터베이스] 복구 시스템 - (2) (0) | 2021.12.11 |
[데이터베이스] 복구 시스템 - (1) (0) | 2021.12.06 |