3. 트랜잭션 (Transaction)
- 트랜잭션이란?
- 트랜잭션의 성질 (ACID)
- 트랜잭션의 상태
- 트랜잭션 스케줄 (Schedule)
- 트랜잭션 회복 (Recovery)
- 병행제어 (Concurrency Control)
- 교착 상태 (Deadlock)
1. 트랜잭션이란?
1.1. 트랜잭션의 정의
- 하나의 논리적 기능을 수행하기 위한 연산의 집합
COMMIT
연산
- 트랜잭션이 정상적으로 종료되어 변경 내용을 DB에 반영하는 연산
ROLLBACK
연산
- 트랜잭션이 비정상적으로 종료되어 일관성이 깨졌을 때, 모든 작업을 이전으로 돌리는 연산
1.2. 트랜잭션의 필요성
- 현금 인출기를 사용하는 도중에 예기치 않은 상황이 발생하여 기계가 멈추는 경우
- 같은 계좌로 동시에 돈을 인출할 때, 두번째로 인출한 경우가 먼저 인출되어 저장된 잔액을 덮어쓰는 경우
- 위와 같은 상황이 발생하지 않도록, 트랜잭션의 ACID 성질을 제공받기 위해서 트랜잭션을 사용함
2. 트랜잭션의 성질
2.1. Atomicity (원자성)
- 트랜잭션의 연산은 DB에 모두 반영되거나 모두 반영되지 않아야함
2.2. Consistency (일관성)
- 트랜잭션 수행이 완료되면 언제나 일관성 있는 데이터베이스 상태로 변환
- 트랜잭션 수행 전과 후의
일관성
유지
2.3. Isolation (독립성)
- 한 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 갱신 중인 데이터에 접근할 수 없음
- 여러 트랜잭션이 수행되더라도 결과는
순차적
이어야함
2.4. Durability (영속성)
- 트랜잭션 작업이 완료되었다면 결과는 영구적으로 반영되어야함
3. 트랜잭션의 상태
3.1. Active
- 트랜잭션이 실행 중인 상태
3.2. Failed
- 트랜잭션이 실행 중에 오류 발생으로 인해 중단된 상태
3.3. Aborted
- 트랜잭션이 비정상적으로 종료되어
ROLLBACK
연산을 수행한 상태
3.4. Partially Committed
- 트랜잭션의 마지막 연산까지 수행하였지만
COMMIT
연산을 수행하기 전의 상태
3.5. Committed
- 트랜잭션이 정상적으로 완료되어
COMMIT
연산을 수행한 상태
4. 트랜잭션 스케줄
동시에 여러개의 트랜잭션들이 병행 실행되는 경우, 연산들이 실행되는 순서
4.1. 직렬 (Serial) 스케줄
- 트랜잭션을 순차적으로 수행하는 방식
4.2. 비직렬 (Non-Serial) 스케줄
- 각 트랜잭션의 연산을 번갈아가며 수행
4.3. 직렬가능 (Serializable) 스케줄
- 직렬, 비직렬 스케줄 기법의 결과가 동일한 경우
5. 트랜잭션 회복
손상된 DB를 손상되기 이전의 상태로 복구시키는 작업
5.1. 로그 (Log)
- 트랜잭션이 수행되어 변경되는 DB의 정보를 기록
REDO
: 로그의 내용을 토대로 재수행하여, 변경된 내용을 DB에 반영하는 작업 (Commit)UNDO
: 비정상적으로 종료되는 경우, 트랜잭션이 시작된 지점으로 복귀 (Rollback)
5.2. 회복 기법
즉시 갱신
- 변경되는 내용을 즉시 DB에 적용
지연 갱신
- 트랜잭션이 부분완료가 되면 DB에 적용
검사 시점
- 트랜잭션 실행 중간에 검사 시점을 설정하여, 검사 시점까지 수행한 후 DB에 적용
그림자 페이지
- 로그를 사용하지 않고, DB를 동일한 크기의 단위인 페이지로 나누어 각 페이지마다 복사하여 그림자 페이지를 보관
- 장애 발생 시, 그림자 페이지를 이용하여 회복
6. 병행 제어 (Concurrency Control)
동시에 여러 트랜잭션을 병행 수행할 때, 트랜잭션들의 일관성을 파괴하지 않도록 제어하는 기술
6.1. 병행제어 기법과 종류
로킹 제어 기법
- 데이터베이스 관리에서 하나의 트랜잭션에
LOCK
을 걸어 사용되는 데이터를 다른 트랜잭션이 접근하지 못하도록 제어하는 기법 - 로킹단위가 커지면 오버헤드는 감소하지만 병행성이 낮아지고, 로킹단위가 작아지면 오버헤드는 증가하지만 병행성이 높아진다
- 데이터베이스 관리에서 하나의 트랜잭션에
2단계 LOCKING 규약
- 트랜잭션 스케줄의 직렬성을 보장하는 대표적인 잠금 기법
확장 단계
: 트랜잭션이 잠금만 수행할 수 있고, 잠금 해제는 수행할 수 없는 단계수축 단계
: 트랜잭션이 잠금 해제만 수행할 수 있고, 잠금은 수행할 수 없는 단계
타임 스탬프 순서 기법
- 트랜잭션이 시스템으로 들어오면 그 때의 시스템 시간 값을 트랜잭션의 타임 스탬프로 부여
- 직렬성 순서를 결정하기 위한 가장 보편적인 방법
6.2. 로킹의 접근허용
공유락 (Shared Lock)
- 사용중인 데이터를 다른 트랜잭션이
Read O , Write X
- 사용중인 데이터를 다른 트랜잭션이
배타락 (Exclusive Lock)
- 사용중인 데이터를 다른 트랜잭션이
Read X , Write X
- 사용중인 데이터를 다른 트랜잭션이
6.3. 병행제어를 하지 않았을 때의 문제점
갱신 분실 (Lost Update)
- 연산 결과의 일부가 없어지는 현상
모순성 (Inconsistency)
- 연산의 결과가 일관성이 결여된 현상
연쇄 복귀 (Cascading Rollback)
- 하나의 트랜잭션의 취소로 인해 다른 트랜잭션도 취소되는 현상
비완료 의존성 (Uncommitted Dependency)
- 하나의 트랜잭션의 수행이 실패한 후 회복되기 이전에, 다른 트랜잭션이 실패한 결과를 참조하는 현상
7. 교착 상태 (Deadlock)
T1 : write(A) read(B)
T2 : read(B) read(A)
위와 같은 트랜잭션이 있다고 가정할 때, T1은 A를 lock하고 B의 lock해제를 기다리고 있다.
또한 T2는 B를 lock하고 A를 기다리고있다. 이처럼 각 트랜잭션이 서로의 자원을 획득하기위해 기다리고 있는 상태를 교착 상태
라고한다.
즉, 트랜잭션들이 실행을 전혀 진전시키지 못하는 무한 대기 상태
에 빠져있는 상태를 말한다.
7.1. 교착 상태의 예방
- 상호배제 조건의 제거
- 점유와 대기 조건의 제거
- 비선점 조건의 제거
- 환형 대기 조건의 제거
7.2. 교착 상태의 회피
자원이 어떻게 요청될지에 대한 추가정보를 제공하도록 요구하는 것으로, 시스템에 Circular Wait
가 발생하지 않도록 자원 할당 상태를 검사한다
- 자원 할당 그래프 알고리즘 (Resource Allocation Graph Algorithm)
- 은행원 알고리즘 (Banker's Algorithm)
'CS > Database' 카테고리의 다른 글
[DB] 4. SQL (0) | 2019.01.21 |
---|---|
[DB] 2. 정규화 (Nomalization) (0) | 2019.01.20 |
[DB] 1. 데이터베이스 (Database) (0) | 2019.01.20 |