트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
트랜잭션이란 작업을 한덩어리로 실행하고 적용을 최종적으로 하는 것을 말하며, REDO와 UNDO는 트랜잭션을 적용할 때 사용하는 기술이다. (간단히 UNDO는 취소하는 개념으로 덮어쓴다고 생각하고, REDO는 취소를 취소하는 개념으로 다시 쓴다고 생각한다.)
원자성(atomicity) :
일관성(consistency) :
격리성(isolation) :
지속성(durability) :
REDO는 복구를 할때 사용자가 했던 작업을 그대로 다시 하지만 UNDO는 사용자가 했던 작업을 반대로 진행한다. 즉 사용자의 작업을 원상태로 되돌린다.
데이터의 변경은 캐시에서 이루어진다. 그때 REDO 로그(변경 이력 데이터)라고 불리는 로그 데이터가 생성된다. 여기서 주목했으면 하는 것이 블록의 데이터가 이 시점(커밋되지 않은 시점)에 변경된다는 점이다.
오라클은 REDO 로그를 커밋이 발생하기 전에 디스크에 기록하는 방식으로 지속성을 구현했다. 단, 앞에서도 설명했듯이 성능에 단점이 있으므로 커밋하는 시점에 연동해서 데이터 블록을 기록하려고 하지는 않는다.
데이터가 변경되면 UNDO 정보가 생성되며, 생성된 UNDO 정보는 세그먼트에 보관된다. 세그먼트에 보관된다는 점으로 인해 UNDO 정보가 테이블스페이스들 중 어딘가에 보관된다는 사실을 알 수 있다.
UNDO 정보가 보관되는 테이블스페이스를 UNDO 테이블스페이스라고 부른다. UNDO 테이블스페이스에는 여러 개의 UNDO 세그먼트가 생성된다. 기본적으로 트랜잭션과 UNDO 세그먼트가 일대일로 대응하기 때문이다.
UNDO 세그먼트는 링 버퍼(ring buffer)이다. 링 버퍼는 조금 지나면 데이터가 덮어쓰이는 버퍼이지만, 커밋하지 않은 데이터는 덮어씌워지지 않는다. 덮어쓰지 못하고 UNDO 세그먼트가 가득 차면 UNDO 세그먼트가 커진다.
undo_retention이라는 파라미터 등으로 UNDO 정보의 유지 시간을 설정할 수 있다. UNDO 정보를 커밋한 이후에도 일정 시간 유지하고 싶을 때 유용한 파라미터이다.