복구 가능한 스케줄(Recoverable Schedule)
복구 가능한 스케줄(recoverable schedule)이란 모든 트랜잭션 쌍 $T_{i}$와 $T_{j}$에 대해,
$T_{i}$가 이전에 기록한 데이터 항목을 $T_{j}$가 읽었다면 $T_{i}$의 commit 연산이 $T_{j}$의 commit 연산보다 먼저 발생하는 스케줄을 말한다.
다음은 복구 불가능한 스케줄의 예시이다.
비연쇄적인 스케줄(Cascadeless Schedules)
하나의 트랜잭션의 취소로 인해 다른 트랜잭션들이 롤백되는 현상을 연쇄적 롤백(cascading rollback)이라고 한다.
이는 많은 양의 작업이 취소되기 때문에 비효율적인 방법이다.
따라서, 연쇄적 롤백이 발생하지 않도록 스케줄에 제한을 주어야 하는데, 이런 스케줄을 비연쇄적 스케줄(cascadeless schedule)이라고 한다.
비연쇄적 스케줄은 모든 트랜잭션 쌍 $T_{i}$와 $T_{j}$에 대해,
$T_{i}$에 의해 기록된 데이터를 $T_{j}$가 읽기 연산을 실행하기 전에 $T_{i}$의 commit 연산이 실행되는 스케줄을 말한다.
비연쇄적 스케줄은 복구 가능한 스케줄이다.
동시성 제어(Concurrency Control)
여러 트랜잭션이 동시에 실행되는 환경에서 트랜잭션 처리에 적합한 스케줄을 생성하는 데 사용할 수 있는 다양한 동시성 제어(concurrency control) 기법이 있다.
동시성 제어 기법의 목적은 직렬 가능성을 보장해주면서 동시성 정도를 높이는 것이다.
(직렬 가능성: conflict serializable and recoverable preferably cascadeless)
이때, 동시성 제어 기법은 동시성의 정도와 오버헤드의 크기 사이에 tradeoff 관계가 있다.
예시)
동시에 한 트랜잭션만 실행 가능하게 하는 동시성 제어 기법의 경우, 동시성의 정도가 낮다.
트랜잭션 고립성(Transaction Isolation)과 관련된 문제
1. dirty read:
한 세션이 commit 되지 않은 다른 세션의 트랜잭션에 의해 변경된 데이터를 읽어올 때,
commit 되지 않은 다른 세션의 트랜잭션이 rollback 되는 경우 문제가 발생한다.
2. non-repeatable read:
한 세션의 트랜잭션이 데이터를 읽은 후, 다른 세션의 트랜잭션이 그 데이터를 갱신하거나 삭제한 후 commit 하면,
데이터를 읽어왔던 트랜잭션이 다시 데이터를 읽어오면 처음 읽어온 값과 다시 읽어온 값이 다른 문제가 발생한다.
3. Phantoms:
한 세션의 트랜잭션이 검색 조건을 만족하는 데이터의 집합을 읽어오고, 다른 세션의 트랜잭션이 검색 조건을 만족하는 데이터를 삽입하면,
데이터를 읽어왔던 트랜잭션이 다시 검색을 하면 처음 읽어온 값과 다시 읽어온 값이 다른 문제가 발생한다.
일관성(고립성) 수준(Consistency Level)
1. serializable:
직렬 가능한 실행을 보장한다.
2. repeatable read:
commit 된 레코드만 읽을 수 있고, 한 트랜잭션이 한 레코드를 두 번 읽는 사이에 다른 트랜잭션이 그 레코드를 갱신하지 못하도록 한다.
하지만 트랜잭션은 직렬 가능하지 않을 수 있다.
-> phantoms 발생 가능
3. read committed:
commit 된 레코드만 읽을 수 있지만, 반복 가능한 읽기는 요구하지 않는다.
-> non-repeatable read, phantoms 발생 가능
4. read uncommitted:
commit 되지 않은 데이터도 읽는다.
-> phantoms, non-repeatable read, dirty read 발생 가능
'전공 > 데이터베이스' 카테고리의 다른 글
복구 시스템 - (2) (0) | 2021.12.11 |
---|---|
복구 시스템 - (1) (0) | 2021.12.06 |
트랜잭션 - (1) (0) | 2021.12.06 |
저장 장치 관리 및 인덱싱: 인덱싱 (0) | 2021.11.29 |
저장 장치 관리 및 인덱싱: 데이터 저장 장치 구조 (0) | 2021.11.26 |