동시성 문제
1. lost update problem:
두 트랜잭션이 같은 데이터 항목에 동시에 접근해 데이터 항목의 값을 갱신할 때,
두 트랜잭션 모두 정상적으로 실행됐음에도 불구하고 한 트랜잭션이 갱신한 값이 사라지는 문제가 발생한다.
2. uncommitted dependency:
한 트랜잭션 T1이 데이터 항목 X의 값을 갱신한 후,다른 트랜잭션 T2가 변경된 X의 값을 읽었을 때 트랜잭션 T1이 롤백되면,
저장된 X와 트랜잭션 T2가 읽은 X의 값이 일치하지 않는 문제가 발생한다.
3. inconsistent analysis problem:
한 트랜잭션의 실행 중에 다른 트랜잭션이 실행될 때,
데이터베이스의 일관성이 깨지는 문제가 발생할 수 있다.
잠금 기반의 규약(Lock-Based Protocol)
- lock(잠금)
lock은 한 데이터 항목에 동시 접근하는 것을 제어한다.
데이터 항목에 다음 두 가지 모드로 잠금을 걸 수 있다.
1. exclusive(X) 모드:
데이터 항목을 읽을 수도 있고 갱신할 수도 있다.
lock-X() 명령어를 통해 요청한다.
2. shared(S) 모드:
데이터 항목을 읽을 수만 있다.
lock-S()명령어를 통해 요청한다.
트랜잭션은 데이터 항목에 어떤 연산을 수행할지에 따라 적절한 모드의 잠금을 concurrency control manager에게 요청하고,
이 요청을 concurrency control manager가 허용했을 때 트랜잭션은 데이터 항목에 연산을 진행할 수 있다.
두 잠금 모드 사이의 호환성 관계는 아래의 잠금 호환성 행렬(lock-compatibility matrix)을 통해 알 수 있다.
요청된 lock이 다른 트랜잭션에 의해 그 데이터 항목이 가지고 있는 lock과 compatible 하다면, 트랜잭션이 그 데이터 항목에 대해 lock을 가질 수 있다.
만약 lock이 허용되지 않으면, lock을 요청한 트랜잭션은 그 데이터 항목에 모든 비호환적 lock이 제거될 때까지 기다려(wait)야 한다.
locking이 직렬 가능성을 보장하지 않을 수도 있다. (일관성을 보장하지 않는다.)
- 2단계 잠금 규약(two-phase locking protocol, 2PLP)
2단계 잠금 규약은 다음과 같다.
1. 증가 단계(growing phase):
트랜잭션이 lock을 얻을 수는 있지만 lock을 해제할 수는 없다.
2. 감소 단계(shrinking phase):
트랜잭션이 lock을 해제할 수는 있지만 lock을 얻을 수는 없다.
이 규약은 직렬 가능성을 보장해준다.
하지만 이 규약에서 연쇄적인 롤백이 발생하거나 트랜잭션이 교착 상태에 빠질 수 있다.
엄격한 2단계 잠금 규약(strict two-phase locking protocol)이라고 불리는 규약을 통해 연쇄적인 롤백을 방지할 수 있다.
이 규약은 트랜잭션이 commit이나 abort를 할 때까지 자신이 가진 exclusive lock을 해제하지 않는다.
더 엄격한 준엄한 2단계 잠금 규약(rigorous two-phase locking protocol)을 통해 연쇄적인 롤백을 방지할 수도 있다.
이 규약은 트랜잭션이 commit이나 abort를 할 때까지 자신이 가진 모든 lock(exclusive + sharing)을 해제하지 않는다.
- 잠금의 구현(Implementation of Locking)
lock manager는 트랜잭션으로부터 lock이나 unlock 요청을 받는 별도의 프로세스로 구현된다.
이는 트랜잭션으로부터 요청 메시지를 받고 다시 응답 메시지를 트랜잭션으로 보내는 역할을 한다.
lock manager는 lock table이라고 불리는 자료 구조를 사용하는데,
이 테이블은 허용된 lock과 대기 중인 요청을 기록하고 있다.
lock table은 데이터 항목의 이름으로 인덱스 된 해시 테이블을 사용해서 구현된다.
예시)
이 lock table은 서로 다른 다섯 개의 데이터 항목을 가지고 있다.
lock table의 각 엔트리는 데이터 항목의 linked list를 가진다.
각 데이터 항목은 이 데이터 항목에 대해서 lock을 가지고 있는 트랜잭션과 lock을 기다리고 있는 트랜잭션의 list를 가지고 있다.
각 레코드(row)는 record identifier를 가진다.
'전공 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 질의 처리와 최적화 - (1) (0) | 2021.12.13 |
---|---|
[데이터베이스] 동시성 제어 - (2) (0) | 2021.12.12 |
[데이터베이스] 복구 시스템 - (3) (0) | 2021.12.12 |
[데이터베이스] 복구 시스템 - (2) (0) | 2021.12.11 |
[데이터베이스] 복구 시스템 - (1) (0) | 2021.12.06 |