솜은 코튼

[DB] 로킹 기법 본문

DB

[DB] 로킹 기법

솜.코 2023. 6. 3. 17:10

 

로킹 기법

.

 

 

트랜잭션의 병행 제어를 위해 사용되는 기법 중 하나는 '로킹(locking)'이다.

로킹은 상호 배제, 즉 독점 제어를 제공한다.

 

또한 lock이 걸린 데이터 아에팀은 lock을 걸은 트랜잭션에 의해서만 unlock 할 수 있다.

 

 

로킹 기법 하에서 모든 트랜잭션은 로킹 규약을 지켜야 한다.

 

1 트랜잭션 T가 read(x)나 write(x) 연산을 하려면
반드시 lock(x) 연산을 실행해야 한다.
2 트랜잭션 T가 실행한 lock(x)에 대해서는 T가 모든 실행을 종료하기 전에
unlock(x) 연산을 실행해야 한다.
3 트랜잭션 T는 이미 lock가 걸려 있는 x에 대해
다시 lock(X)를 실행시키지 못한다.
4 트랜잭션 T는 x에 lock을 자기가 걸지 않았다면
unlock(x)를 실행시키지 못한다.

 

 

만약 판독만 하려는 트랜잭션에 대해 병행 접근을 허용한다면 lock 연산은

S(공용)타입과 X(전용)타입 lock 연산으로 나눌 수 있다.

 

lock-S(공용 로크) 트랜잭션 T는 아이템 x에 대해
판독할 수는 있지만 기록할 수는 없다.
이때 공용 lock을 동시에 걸 수 있다.
lock-X(전용 로그) 트랜잭션 T는 아이템 x에 대해
판독과 기록 모두 할 수 있다.
이때 다른 트랜잭션은 lock을 걸 수 없다.

 

 

이러한 lock 타입에 대한 양립성은 다음과 같이 정의할 수 있다.

 

 

 

각 lock에 대해 세 개의 필드 <데이터 아이템, lock, 트랜잭션 수>를 가진

레코드를 만들어 관리할 수 있다.

여기서 lock은 lock-S, lock-X, unlock을 나타내는 코드값이 된다.

 

 

이 공용 lock이 허용될 때 공용 로킹 규약을 따라야 한다.

 

1 트랜잭션 T가 read(x) 연산을 실행하려면
lock-S(x)나 lock-X(x) 연산을 실행해야 한다.
2 트랜잭션 T가 write(x) 연산을 실행하려면
lock-X(x) 연산을 실행해야 한다.
3 트랜잭션 T가 lock-S(x)나 lock-X(x) 연산을 하려 할 때
x가 양립될 수 없는 타입이면 풀릴 때까지 기다린다.
4 트랜잭션 T가 모든 실행을 종료하기 전에는
T가 실행한 모든 lock(x)에 대해 unlock(x)를 실행해야 한다.
5 트랜잭션 T는 자기가 lock을 걸지 않은 데이터 아이템에 대해
unlock을 실행할 수 없다.

 

 

2단계 로킹 규약

.

 

이 규약은 모든 트랜잭션들이 lock와 unlock 연산을

다음과 같이 두 단계로 구분하여 실행할 것을 요구한다.

 

확장 단계 트랜잭션은 새로운 lock연산만 실행할 수 있고
unlock 연산은 수행할 수 없는 단계
축소 단계 트랜잭션은 unlock 연산만 실행할 수 있고
unlock 연산을 수행하면
lock 연산은 더 이상 실행할 수 없는 단계

 

 

트랜잭션은 처음에 lock 연산을 실행하는 확장 단계로 들어간 후

unlock 연산을 실행하면 그 시점부터는 더 이상 새로운 lock 연산을 실행할 수 없다.

 

따라서 한 트랜잭션에서 모든 lock 연산(lock-X, lock-S)들이

첫 번째 unlock 연산 전에 실행되었다면

이 트랜잭션은 2단계 로킹 규약을 준수하였다고 말할 수 있다.

 

 

 

왼쪽 스케줄에서 T1은 unlock(x) 이후에 lock-X(y)를 수행하고,

T2도 unlock(x) 이후에 lock-X(y)를 수행하여

2단계 로킹 규약을 준수하고 있지 않다.


오른쪽 스케줄에서 T1은 lock(y)가 unlock(x) 이전에 수행되고,

T2도 lock(y)가 unlock(x) 이전에 수행되어

 2단계 로킹 규약을 준수하고 있다.

 

만일 어느 한 스케줄에 참여하고 있는 모든 트랜잭션들이

2단계 로킹 규약(2PLP)을 준수한다면 그 스케줄은 직렬 가능하다.

 

하지만 직렬 가능하기 위해서 반드시 2단계 로킹 규약만을 따라야 한다는 것은 아니다.

 

 

 

왼쪽 스케줄에서 T2는 2단계 로킹 규약을 따르고 있으나

T1은 2단계 로킹 규약을 따르고 있지 않다.

 

따라서 왼쪽 스케줄은 직렬 가능성을 보장할 수 없다.

직렬 가능성을 보장할 수 없다는 것은

직렬 가능할 수도 있고 가능하지 않을 수도 있다는 뜻이다.

 

오른쪽 스케즐은 T1과 T2 모두 2단계 로킹 규약을 따르고 있지 않다.

하지만 사이클이 존재하지 않아 직렬 가능하다.

 

 

 

 

 

 

 

 

* 해당 글은 '데이터베이스 시스템' 책을 참고하여 작성하였습니다. 출처: 데이터베이스 시스템 (이석호)