Forec와 Steal은 트랜잭션 처리 시 데이터 기록에 관한 옵션들이다.
트랜잭션이 완료된 후 바로 데이터를 디스크에 기록할 것인가?
Force: 바로 기록한다No-Force: 바로 기록하지 않는다(Redo 필요)트랜잭션이 완료되었으므로 당연히 기록할 것 같지만 성능 효율 등을 이유로, 대부분의 DBMS는 적당히 기록해야 할 때 기록하는 No-Force 매커니즘을 사용한다고 한다.
이미 커밋한 트랜잭션의 수정을 재반영하는 복구 작업
트랜잭션이 완료되지 않은 상태에서 데이터를 디스크에 기록할 것인가?
Steal: 기록한다(Undo 필요)No-Steal: 기록하지 않는다트랜잭션이 완료되지 않았으므로 당연히 기록하면 안될 것 같지만 성능 효율 등을 이유로, 대부분의 DBMS는 적당히 미리 기록하는 메커니즘을 사용한다고 한다.
아직 완료되지 않은 트랜잭션이 수정한 페이지들도 디스크에 출력될 수 있으므로, 만약 해당 트랜잭션이 어떤 이유든 정상적으로 종료될 수 없게 되면 트랜잭션이 변경한 페이지들은 원상 복구되어야 한다.
따라서 대부분의 DBMS는 버퍼 관리 정책으로
Steal을, 커밋 정책으로No-Force을 사용한다.

대부분의 DBMS는 Steal과 No-Force 정책을 사용하기 때문에 Redo와 Undo 로그가 필요하다.
로그란 Redo와 Undo 동작의 ordered list로, 각 행마다 LSN(Log Sequence Number, log record의 position), transactionID, pageID, offset, length, old data, new data, 추가적인 컨트롤 정보 등이 포함되어 있다.
value 그 자체를 저장하는 로깅 방법. 변경 전의 Before Image와 After Image를 모두 저장한다.
operation을 기록하는 로깅 방법. 실제 작업을 수행한 명세서를 저장하는 방식이다. physical logging에 비해 가볍지만, 복잡하고 sql을 재실행해야 하며, Recovey가 어려운 단점이 있다고 한다.
physical과 logical loggig의 장점을 합친 로깅 방법. Recovery가 쉬우며, compact한 log size를 제공한다.

disk에 page를 쓰기 전에 관련된 Undo 정보가 로그에 써져야 한다.
( == flush undo log prior to writing a page to disk)
트랜잭션이 정상적으로 종료 처리되기 위해서는 먼저 Redo 정보가 로그에 써져야 한다.
Recover할 때, 너무 많이 되돌아가지 않도록 하기 위해 DBMS에서는 주기적으로 checkpoint를 생성한다. checkpoint로 설정한 지점 이전까지는 트랜잭션이 성공적으로 수행이 되어서 disk에 확실하게 저장된 상태를 의미한다.

예를 들어 위의 그림에서,
checkpoint를 만들 때 실행 중인 모든 트랜잭션을 중지하고 디스크에 버퍼의 값을 저장하는데, 트랜잭션을 중지하지 않고 checkpoint를 만드는 방법을 fuzzy checkpoint라고 한다.

SQLite는 운영체제의 비정상 종료나 갑작스러운 전원 차단이 발생했을 때, 사용자 데이터의 일관성을 유지하기 위해 Rollback Journal을 제공한다.
롤백 저널 파일은 트랜잭션 과정 동안 데이터베이스 파일 쓰기 상태 이전의 초기 값을 복원하는데 필요한 정보를 담는 파일이며, 각각의 데이터베이스 파일마다 롤백 저널 파일을 유지한다.
(강의 내용 파악이 아직 다 안되어서 이후 부분은 좀따 정리하도록 하겠다....)