[DB] 트랜잭션, REDO와 UNDO

임유빈·2022년 7월 23일
0

DB

목록 보기
15/15
post-thumbnail

1. 트랜잭션

(1) 개념

  • 하나의 작업을 수행하는 데 필요한 데이터베이스 연산들을 모아놓은 것으로 논리적인 작업의 단위이다.
  • 작업 수행에 필요한 SQL 문들의 모임으로 특히 데이터베이스를 변경하는 INSERT, DELETE, UPDATE문의 실행을 관리한다.
  • 장애 발생 시에 복구작업이나 병행 제어 작업을 위한 중요한 단위로 사용된다.

트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

트랜잭션이란 작업을 한덩어리로 실행하고 적용을 최종적으로 하는 것을 말하며, REDO와 UNDO는 트랜잭션을 적용할 때 사용하는 기술이다. (간단히 UNDO는 취소하는 개념으로 덮어쓴다고 생각하고, REDO는 취소를 취소하는 개념으로 다시 쓴다고 생각한다.)

(2) 특성

  • 원자성(atomicity) :

    • 모두 정상적으로 실행되거나 하나도 실행되지 않아야 하는 all-or-nothing 방식을 의미한다.
    • 장애가 발생된 경우 : (UNDO) 지금까지 실행한 연산 처리를 모두 취소하고, 데이터베이스를 트랜잭션 작업 전 상태로 되돌려야 한다.
    • 원자성의 보장을 위해 장애 발생 시 회복 기능이 필요하다.
  • 일관성(consistency) :

    • 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 함을 의미한다.
  • 격리성(isolation) :

    • 수행 중인 트랜잭션이 완료될 때까지 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없음을 의미한다.
    • 격리성의 보장을 위해서는 여러 트랜잭션이 동시에 수행되더라도 마치 순서대로 하나씩 수행되는 것처럼 정확하고 일관된 결과를 얻을 수 있도록 제어하는 기능이 필요하다.
  • 지속성(durability) :

    • 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 영구적이어야 함을 의미한다.
    • 지속성의 보장을 위해서는 장애 발생 시 회복 기능이 필요하다.

(3) 트랜잭션의 4가지 특성을 보장하기 위해 필요한 기능

2. REDO와 UNDO의 개념과 구조

(1) 개념

  • REDO는 오래된 데이터를 최신 데이터로 만들기 위해 존재한다.
  • UNDO는 최신 데이터를 오래된 데이터로 만들기 위해 존재한다.
  • 읽기 일관성을 위해 UNDO를 사용한다.
  • 장비에 장애가 발생하거나 인스턴스가 비정상 종료했을 때는 REDO와 UNDO를 사용해서 데이터를 복구하고, 커밋하지 않은 데이터의 롤백을 수행한다.

REDO는 복구를 할때 사용자가 했던 작업을 그대로 다시 하지만 UNDO는 사용자가 했던 작업을 반대로 진행한다. 즉 사용자의 작업을 원상태로 되돌린다.

  • 예시 : COMMIT1 > COMMIT2 > COMMIT3 일 때 COMMIT1로 돌아간다면
    • REDO는 COMMIT1의 로그를 찾아 덮어씌운다 : COMMIT2와 COMMIT3로는 돌아갈 수 없다.
    • UNDO는 COMMIT3 > COMMIT2 > COMMIT1로 순차적으로 돌아간다 : COMMIT2와 COMMIT3은 남아있다.

(2) REDO 구조

데이터의 변경은 캐시에서 이루어진다. 그때 REDO 로그(변경 이력 데이터)라고 불리는 로그 데이터가 생성된다. 여기서 주목했으면 하는 것이 블록의 데이터가 이 시점(커밋되지 않은 시점)에 변경된다는 점이다.

오라클은 REDO 로그를 커밋이 발생하기 전에 디스크에 기록하는 방식으로 지속성을 구현했다. 단, 앞에서도 설명했듯이 성능에 단점이 있으므로 커밋하는 시점에 연동해서 데이터 블록을 기록하려고 하지는 않는다.

(3) UNDO 구조

데이터가 변경되면 UNDO 정보가 생성되며, 생성된 UNDO 정보는 세그먼트에 보관된다. 세그먼트에 보관된다는 점으로 인해 UNDO 정보가 테이블스페이스들 중 어딘가에 보관된다는 사실을 알 수 있다.

UNDO 정보가 보관되는 테이블스페이스를 UNDO 테이블스페이스라고 부른다. UNDO 테이블스페이스에는 여러 개의 UNDO 세그먼트가 생성된다. 기본적으로 트랜잭션과 UNDO 세그먼트가 일대일로 대응하기 때문이다.

UNDO 세그먼트는 링 버퍼(ring buffer)이다. 링 버퍼는 조금 지나면 데이터가 덮어쓰이는 버퍼이지만, 커밋하지 않은 데이터는 덮어씌워지지 않는다. 덮어쓰지 못하고 UNDO 세그먼트가 가득 차면 UNDO 세그먼트가 커진다.

undo_retention이라는 파라미터 등으로 UNDO 정보의 유지 시간을 설정할 수 있다. UNDO 정보를 커밋한 이후에도 일정 시간 유지하고 싶을 때 유용한 파라미터이다.

0개의 댓글