1. Transaction의 특징

1) Transaction에 대한 정의
  • 일의 단위(A Single Unit of Work)
  • ACID 원칙
원자성(Atomicity)하나의 데이터 처리를 원자적 수행 단위로 수행
일관성(Consistency)데이터 처리를 실행 후 데이터베이스는 하나의 일관된 상태에서 또 다른 일관된 상태로 변경
격리성(Isolation)하나의 데이터 처리는 완료 시까지 자신이 수정한 데이터의 내용을 다른 애플리케이션에서 참조할 수 없도록 보장
영속성(Durability)데이터 처리에 의해 변경된 내용은 이후 어떠한 고장이 있어도 손상되어서는 안됨
  • 데이터 변경(DML)시 적용
  • Transaction 단위로 데이터의 일관성을 보장
  • TX Lock으로 Transaction 보호

2. XID(Transaction Identifier)

1) XID란?
  • Transaction이 부여 받은 ID
  • Undo Segment Header의 Transaction Table의 Slot이 할당되면서 명시적으로 Transaction이 시작
  • usn.slot.wrap
    ☞ usn = Undo SEGMENT Number
    ☞ slot = TRANSACTION Slot 번호
    ☞ wrap = Wrap 번호
2) XID
  • 해당 트랜잭션에 대해 언두 세그먼트(Undo segment)를 할당한다.
  • 이 경우 현재 온라인상태인 언두 세그먼트 중 하나를 우선적으로 사용한다.
  • 언두 세그먼트의 선택은 랜덤하게 이루어지며, 다른 트랜잭션이 사용중이라면 3번까지 재시도한다.
  • 이 과정이 실패하면 오프라인 상태의 언두 세그먼트를 온라인화해서 사용한다.
  • 만일 이 과정까지 실패하면, 새로운 언두 세그먼트를 생성한다.
  • 이 과정을 통해서도 언두 세그먼트를 할당받지 못하면 오라클 8i에서 사용하던 롤백 세그먼트(Rollback Segment) 알고리즘을 사용한다.
  • 즉, 이미 다른 트랜잭션에 의해 사용중인 언두 세그먼트 중 가장 사용량이 적은 것을 사용한다.
  • 서버 프로세스가 언두 세그먼트를 획득하는 시점에 적당한 온라인 상태의 언두 세그먼트가 없으면 온라인 상태의 언두 세그먼트가 확보될 때까지 enq: US - contention 이벤트를 대기한다.

  • 언두 세그먼트를 할당받으면, 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯(transaction table slot)을 생성한다.
  • 트랜잭션 테이블을 생성하고 나면 TXID(Transaction ID)를 생성하고, 현재 트랜잭션에 할당한다.
  • TXID는 V$TRANSACTION 뷰의 XIDUSN, XIDSLOT, XIDSQN으로 표현되는데, 이 값은 트랜잭션에 할당된 언두 영역의 언두 세그먼트 헤더에 존재하는 트랜잭션 테이블의 정확한 위치를 가리킨다.
  • 트랜잭션은 반드시 언두 영역을 할당받은 다음에 ID를 부여받는 것에 유의하자.






3. SCN(System Commit Number)

1) SCN이란?
  • 커밋 될 때마다 증가하는 번호
  • 읽기일관성(Read Consistency) 지원
    ☞ Query가 시작된 시점(SCN)을 시준으로 Block의 SCN이 그와 같거나 작은 Block만을 읽을 수 있도록 하는데 기준으로 사용
  • Redo Log Record는 SCN 순으로 기록
  • 시스템 복구에 이용

4. Undo

1) Undo 사용 목적
  • 읽기일관성(Read Consistency) 지원
    ☞ SCN History Version을 저장 관리
  • Rollback 지원
    ☞ Undo 데이터를 이용하여 완료되지 않은 Transaction의 Rollback 처리
  • "Readers don't block writes, writes don't block readers" Mechanism
    ☞ Multi Versioning 지원
    ☞ 읽기와 쓰기가 서로 간섭하지 않으며 독립적으로 일관성 있게 처리 가능
2) Redo & Undo 수행방식
  • 42 Block의 Slot 0, 1의 데이터 존재함
  • 이 데이터중 team='AUS' 레코드의 runs 값을 75로 변경하고자 함
  • Log Buffer와 Undo Header에 각각 slot 할당

  • Log Buffer와 Undo Block에 변경전 값 저장

  • Log Buffer에 변경후 값 저장
  • 42 Block 값 변경
  • team='AUS' 레코드의 wickets 값을 7로 변경하고자 함
  • Log Buffer와 Undo Block에 변경전 값 저장

  • Log Buffer에 변경후 값 저장
  • 42 Block 값 변경
  • team='AUS' 레코드의 runs와 wickets을 77, 8로 변경하고자 함
  • Log Buffer와 Undo Block에 변경전 값 저장

  • Log Buffer에 변경후 값 저장
  • 42 Block 값 변경

  • COMMIT
  • Log Buffer slot 종료
  • Undo Header slot 종료
3) Rollback 수행방식
  • 42 Block의 Slot 0, 1의 데이터 존재함
  • 이 데이터중 team='AUS' 레코드의 wickets 값을 9로 변경하고자 함
  • Log Buffer와 Undo Header에 각각 slot 할당

  • Log Buffer와 Undo Block에 변경전 값 저장

  • Log Buffer에 변경후 값 저장
  • 42 Block 값 변경
  • 이후 추가로 team='AUS' 레코드의 wickets 값을 10으로 변경하고자 함
  • Log Buffer와 Undo Block에 변경전 값 저장

  • Log Buffer와 42 Block에 변경후 값 저장

  • ROLLBACK
  • Undo Block에서 가장 최근에 추가된 내용을 Log Buffer에 추가

  • 42 Block의 내용을 이전값으로 변경
  • 1차 Log Buffer의 slot 닫음
  • Undo Block에서 그 다음 추가된 내용을 Log Buffer에 추가

  • 42 Block의 내용을 이전값으로 변경
  • 2차 Log Buffer의 slot 닫음
  • 전체 Log Buffer의 slot 닫음
  • Undo Header의 slot 닫음

5. Isolation Level - ANSI

1) Redo Uncommitted
  • Dirty Read 가능
  • Oracle은 지원하지 않음
2) Redo Committed
  • Dirty Read 불가
  • Oracle 기본 Level
3) Repeatable
  • Transaction 내에서 동일한 Query 수행 시 동일한 값 보장
  • Phantom Read 방지 불가
  • Oracle은 지원하지 않음
4) Serializable
  • 가장 강력한 수준
  • 세션 레벨에서 적용

6. 읽기 일관성

  • 데이터 검색 시 항상 Transaction 시작시점의 SCN(System Change Number)보다 작거나 같은 SCN Block에서만 데이터 검색
  • 현재 SELECT 하는 세션의 SCN이 10023이면 SCN 10021 블록과 SCN 10022 블록은 데이터 검색이 가능하나, SCN 10025 블록은 검색 못함

문서에 대하여