6._문장수준_읽기_일관성

조회 수 8107 추천 수 0 2012.03.13 19:11:34
정찬호 *.131.56.197

1. 문장 수준 일관성이란

  • 정의: 단일 SQL문이 수행되는 도중에 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라고 일관성 있는 결과집합을 리턴하는 것을 의미
    • 오라클은 다른 DBMS와는 차별화된 방법으로 문장 수준 일관성을 유지한다. 다른 DBMS에서 발생할 수 있는 문장 수준 일관성을 지키지 못하는 경우에 대해 사례를 통해 이해해보자
      2012-03-11_235429.jpg
    • 사례1. 위 계좌들에 대한 잔고의 합을 구하는 쿼리를 실행했을때 (TX1)
      아래 쿼리가 실행되었다고 가정한다. (TX2)
      >INSERT INTO 계좌(계좌번호, 잔고) VALUES (9,100);
      >COMMIT;

      이렇게 되면 새로운 레코드가 어디에 위치하느냐에 따라 TX1의 값이 달라질 수 있다.

    • 사례2. TX1이 실행되는 중에 계좌이체를 수행하는 쿼리가 실행된다면? (TX3)
      >UPDATE 계좌 SET 잔고=잔고+100 WHERE 계좌번호 =7;
      >UPDATE 계좌 SET 잔고=잔고-100 WHERE 계좌번호 =2;
      이 역시 TX3에서의 UPDATE되는 레코드의 위치와 실행 순간에 따라 일관성 없는 결과 값이 나올 수 있다.


  • 테이블 레벨 Lock을 통한 읽기 일관성 확보
    • 비 일관성 읽기 문제를 해결하기 위한 일반적인 해법: 트랜잭션 고립화 수준 샹향 조정
    • 트랜잭션 고립화 수준을 상향 조정한다고 해서 모두 좋아지는 것은 아니다.
      Lock이 발생하는 범위가 넓어지고 결국 교착상태가 발생할 가능성을 높이게 되는 효과도 주게 된다.



2. Consistent 모드 블록 읽기

  • 다중 버전 읽기 일관성 모델
꾸미기_01.jpg
    • 쿼리가 시작되기 전에 이미 커밋된 데이터만 읽고, 커리 시작 이후에 커밋된 변경사항은 읽어들이지 않는다.
    • 변경이 발생한 블록을 읽을 때는 현재의 Current 블록으로부터 CR 블록을 생성해서 쿼리가 시작된 시점으로 되돌린 후 그것을 읽는다.
    • Current 블록은 디스크로부터 읽혀진 후 사용자의 갱신사항이 반영된 최종 상태의 원본 블록이며 CR블록은 그 복사본일 뿐이다.
    • Current 블록은 오직 한개이나 CR블록은 여러버전이 존재할 수 있다.
    • RAC에서는 Current 블록의 SCN이 쿼리 SCN보다 작다면 쿼리가 시작된 이후에 변경이 없었던 블록임을 보장받는다.
  • SCN(System Commit Number)
    • 시간정보로 시스템 전체적으로 공유되는 글로벌 변수라고 이해.
    • 주요 사용처: 읽기 일관성, 동시성 제어, 생성된 Redo 로그 정보 순서 분석, 데이터 복구 등
  • 블록 SCN(System Change Number)
    • 블록이 마지막으로 변경된 시점 정보를 식별하기 위해 모든 블록 헤더에 SCN정보를 관리


3. Consistent 모드 블록 읽기의 세부 원리

  • 쿼리 SCN을 가지고 Consistent 모드로 읽을때, 3가지 경우로 설명할 수 있다.
    (1) Current 블록SCN <= 쿼리 SCN이고 커밋된 상태
    쿼리가 시작된 후 해당 블록에 변경이 가해지지 않았음을 의미한다. CR블록 생성 없이 Current 블록을 그대로 읽는다.

    (2) Current 블록SCN > 쿼리 SCN이고 커밋된 상태
    쿼리가 시작되고 해당 블록에 변경이 가해지고 커밋되었다.
    꾸미기_02.jpg

    위의 그림에서
    2번 CR Cloning을 통해 Current 블록 내용을 그대로 복제하고
    3번과정에서 Undo정보를 통해 쿼리SCN보다 더 낮은 마지막 커밋 시점으로 돌아간다.
    최종적으로 완성된 버전의 CR블록은 블록SCN이 쿼리SCN보다 작고 커밋된 내용만 있어야 한다.
    만약, CR블록을 과거 상태로 되돌리는 과정에서 필요한 Undo정보가 덮어 쓰여져 계속 롤백이 불가능할때 'Snpashot too old' 에러가 발생한다.
    ※ UBA(Undo Block Address)를 통한 계속적인 롤백 가능 : ITL에 대한 변경내역이 Undo에 저장됨.
    ※ 10g부터는 IMU(In-Memory Undo)매커니즘이 작동하여 CR롤백을 위해 Undo를 참조하지 않고 Shared Pool내의 IMU Pool에 저장된 값을 이용한다. 이 기능은 히든 파라미터 '_in_memory_undo'와 '_imu_pols'에 의해 제어된다. 이 기능을 통해 Undo세그먼트 헤더블록과 Undo 세그먼트 블록 버퍼에 대한 래치 경합 및 Pinning을 줄일 수 있다.

    (3) Current 블록이 Active인 상태, 즉 갱신이 진행 중인 것으로 표시 돼 있을 때
    Active 상태의 블록인 경우 일단 트랜잭션 테이블로부터 커밋정보를 가져와 블록 클린아웃 시도
    그 결과에 따라 위의 (1) 또는 (2) 과 같은 과정으로 진행된다.

    <사례 1>
    111.JPG

    <사례 2>
    222.JPG

    <사례 3>
    333.JPG

    <사례 4>
    444.JPG

    <사례 5>
    555.JPG

  • DBA당 CR 개수 제한
    •  CR Copy 수는 무제한일까? 아니다.
      자주 갱신되는 특정 테이블에 조회까지 많이 발생한다면?
      최악의 경우 버퍼 캐시가 같은 블록에 대한 CR Copy로 가득차는 일이 발생할 수 있다.
    • 이를 방지하기 위해 오라클에서는 하나의 데이터 블록마다 6개까지만 CR Copy를 허용한다
    • _db_block_max_cr_dba로 제어
    • CR Copy는 Free 버퍼가 필요할 때 1순위로 밀려난다.



      • 오라클 고도화 원리와 해법 1 (bysql.net 2012년 1차 스터디)
      • 작성자: 정찬호 (hyperch)
      • 최초작성일: 2012년 3월 11일
      • 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
      • 문서의 잘못된 점이나 질문사항은 본문서에 댓글로 남겨주세요. ^^