Transaction Manager는 Concurrency Control ( 병행 제어 )와 함께 장애 발생 시 Recovery(복구) 기능을 수행한다. 이는 다음의 Transaction - ACID 속성을 만족하기 위함이다.
Consistency와 Isolation을 보장하기 위해 C&C 를 사용
Atomicity와 Durability를 보장하기 위해
e.g crash 발생 시점
T1,T2,T3 : Transaction 완료 (commit 상태)
T4, T5 : Transaction 실행 중 (abort 상태)
T1, T2, T3 : redo (변경 후 값을 기억해서 재실행,disk에 변경 사항 반영)
T4, T5 : undo (변경 전 값으로 세팅)
redo하기 위해 log record에 기록 (before valuse & after value)
update할 때마다 log record를 남겨야함.
따라서, log file이 Recovery의 핵심.
① Force : 매 transaction마다 강제로, 즉시 disk에 WRITE
② Steal : 진행 중인 Transaction이 사용 중인 buffer frame을 다른 Transaction이 뺏어서 사용
① minimize response time
② enhance throughput
No force & Steal ( page replacement algorithm)
=> 따라서 Transaction Manager는 log를 통해 Atomicity & Durability를 보장
flushedLSN >= pageLSN
- Disk에 반영된 로그 레코드의 LSN >= page를 마지막으로 업데이트한 로그 레코드의 LSN
- 즉 디스크에 로그 레코드가 먼저 반영!
M/M에서 CPU에 있는 log record가 data page(disk page)에 WRITE하여야함.
- 하나의 transaction이 여러 개의 log record가 존재할 수 있음.
=> 같은 tranasaction의 log record를 연결하기 위해 prevLSN이 관리
① Log Record Field
prevLSN : 같은 Transaction에 속한 log record들의 LSN을 backwrard chaining을 통해 가지고 있음
type : Update/Commit/Abort/End
② checkpoint : log record가 계속 증가하면 처음부터 해당 record를 찾아서 redo/undo하기 힘듬=> (주기적으로) 중간에 체크를 통해 end로 된 transaction를 모두 삭제(앞으로는 거기이후부터 검사하도록)
check point record의 마지막을 저장하는 master
③ CLR(compensation log record) : Undo 중간에 crash가 또 발생한다면? redo/undo를 하는 와중에도 log를 남김. 따라서 이 record로 처리
(추후에 다룸)
그렇다면 Log Record를 가지고 어떻게 redo/undo를 통해 Recovery를 실현할 수 있는가에 대해 다음글에서 자세히 다루겠다.