transaction은 DBMS또는 유사한 시스템의 상호 작용의 단위이다.
A가 B에게 송금을 한다고 가정해 보자.
A의 계좌에서 해당 금액만큼 돈을 뺀다. B의 계좌에 해당 금액만큼 돈을 더한다.
하지만 중간에 query문이 실패하게 된다면 큰일이 발생할 수 있다.
트랜잭션은 원하는 작업의 단위를 정하고, 작업을 수행하는 도중 문제가 발생하면 이전에 진행되었던 작업도 진행되지 않는다. 모든 작업을 안정적으로 끝마친 후에야 실제 데이터베이스에 반영이 된다.
이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)를 보장한다. 이 성질을 ACID라 부른다.
하나의 트랜잭션이 더 작게 나눌 수 없는 최소의 단위이다.
트랜잭션이 모두 반영되거나 아니면 전혀 반영되지 않아야 하는 특징을 나타낸다.
all or nothing
트랜잭션이 완료된 결괏값이 일관적인 데이터베이스 상태를 유지하는 것을 말한다.
모든 계좌의 돈은 0원 이상이어야 한다는 제약 조건이 있다면 이를 위반하는 트랜잭션은 모두 중단되어야 한다.
트랜잭션이 수행되고 있을 때, 다른 트랜잭션의 연산작업이 중간에 끼어들어 기존 작업에 영향을 주지 못하도록 하는 것을 말한다.
독립성이 보장된다면 계좌 이체작업을 진행하고 있는 도중에 계좌의 잔액을 조회한다거나 하는 작업을 동시에 수행할 수 없게 되는 것이다.
트랜잭션을 성공한 후 데이터베이스에 반영된 것은 영원히 반영되어야 한다는 것을 의미한다.
하나의 트랜잭션 처리가 비정상적으로 종료되면 트랜잭션의 원자성을 위해 해당 트랜잭션에서 작업한 모든 연산을 취소하여 실제 데이터베이스에 반영하지 않는다.
하나의 트랜잭션 작업이 정상적으로 끝나쳤을 때 커밋을 하게 된다. 커밋을 해야만 진짜 데이터베이스에 변경사항이 반영되는 것이다.
트랜잭션이 수행을 시작하여 현재 수행 중인 상태
마지막 연산이 실행된 직후의 상태. 연산은 모두 처리했지만, 데이터베이스에 반영되지 않는다.
트랜잭션이 성공적으로 완료되어 Commit을 한 상태
장애가 발생하여 트랜잭션이 중단된 상태
수행에 실패하여 Rollback연산을 실행한 상태
크게 Query Processor, Storage System으로 구성된다.
다시 하다라는 뜻이다. 기본적으로 복구의 역할을 한다. 데이터베이스에 하는 데이터 변경 작업은 모두 REDO에 기록이 된다. REDO는 복구를 할때 사용자가 했던 작업을 그대로 다시 한다. redo log file로 저장한다.
redo log buffer는 메모리 영역이다. log buffer가 가득 차게 되면 log switch가 발생하여 다른 log buffer에 내용을 채우고, 가득 찬 redo log buffer에 있던 데이터들을 Disk File로 저장하게 된다. 이를 Redo Log File이라 한다. 이를 LGWR(Log Writer)라 한다.
원상태로 돌리는 뜻이다. 작업 롤백과 읽기 일관성, 복구를 한다.
UNDO는 사용자가 했던 작업을 반대로 진행한다.
Redo와 마찬가지로 checkpoint시에는 디스크에 저장되지만, commit시 필요가 없기 때문에 버린다.
수정된 페이지를 언제든지 디스크에 쓸 수 있는 정책. ¬STEAL을 사용한다면 수정된 페이지들을 트랜잭션 종료 시점까지 버퍼에 유지한다.
만약 트랜잭션 종료 전에는 어떤 경우에도 수정된 페이지를 디스크에 쓰지 않는다면, UNDO 작업은 매우 간단해 진다. 하지만 매우 큰 크기의 메모리버퍼가 필요하다.
수정했던 모든 페이지를 트랜잭션 커밋 시점에 디스크에 반영하는 정책. ¬FORCE을 사용한다면 수정했던 페이지를 트랜잭션 커밋 시점에 디스크에 반영하지 않는다. 대부분의 DBMS는 ¬FORCE정책을 사용한다.
FORCE정책을 따르면 트랜잭션이 커밋되면 수정되었던 페이지들이 이미 디스크 상의 데이터베이스에 반영되었으므로 REDO복구가 필요 없게 된다.
하지만 이를 따르지 않으면 REDO복구가 필요하다.
REDO 데이터를 이용해 마지막 CHECKPOINT부터 장애까지의 DB BUFFER CACHE를 복구하게 된다.