솜은 코튼
[DB] 로킹 기법 본문
로킹 기법
.
트랜잭션의 병행 제어를 위해 사용되는 기법 중 하나는 '로킹(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 타입에 대한 양립성은 다음과 같이 정의할 수 있다.
![](https://blog.kakaocdn.net/dn/48NUg/btsiwjN3LuM/8KDXQjSvZjmtwi73VZOZq0/img.png)
각 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단계 로킹 규약을 따르고 있지 않다.
하지만 사이클이 존재하지 않아 직렬 가능하다.
* 해당 글은 '데이터베이스 시스템' 책을 참고하여 작성하였습니다. 출처: 데이터베이스 시스템 (이석호)
'DB' 카테고리의 다른 글
[DB] 3단계 데이터베이스 (외부 스키마, 개념 스키마, 내부 스키마) (0) | 2023.06.04 |
---|---|
[DB] 교착상태 (0) | 2023.06.03 |
[DB] 트랜잭션 스케줄 (직렬 가능성 검사) (0) | 2023.06.02 |
[DB] 트랜잭션 스케줄 (뷰 직렬 가능 스케줄) (0) | 2023.06.02 |
[DB] 트랜잭션 스케줄 (직렬 가능 스케줄) (0) | 2023.06.02 |