by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

문장수준 읽기 일관성




  1. 읽기 일관성 구현 (Dirty Read 방지)

    DBMS 읽기 일관성 구현 방법 비고
    오라클 Undo 완벽함(ORA-1555)
    다른 DBMS Row Lock 안완벽함(일관성, 동시성등 문제)
    • 다른 DBMS 의 문제 데모
      계좌번호 1 2 3 4 5 6 7 8 9 10
      잔고 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000
      • 데모 #0
         
        TX1> select sum(잔고) from 계좌;
        
      • 데모 #1 - 레코드가 추가된 위치에 따라서 총합계가 달라진다.
         
        TX2> insert into 계좌 (계좌번호, 잔고) values ( 11, 1000 );
        TX2> commit; 
        
      • 데모 #2 - 레코드의 순서와 TX1, TX2 의 실행 순서에 따라서 총합계가 달라진다.
         
        TX2> update 계좌 set 잔고 = 잔고 + 100 where 계좌번호 = 7;
        TX2> update 계좌 set 잔고 = 잔고 - 100 where 계좌번호 = 3;
        TX2> commit; 
        
    • 다른 DBMS 의 문제 대안
      대안(트랜잭션 고립화 수준 변경) 설명 비고
      Level 1, Read Committed (기본) 값을 읽는 순간에만 Shared Lock 다른 트랜잭션에 의해 Exclusive Lock 된 Row 는 못 읽음(동시성), 트랜잭션 진행중에 읽고 지나간(Shared Lock 이 해제된) Row 에 다른 트랜잭션이 변경 가능(일관성)
      Level 2, Repeatable Read 트랜잭션이 완료될 때 까지 Shared Lock 교착상태 유발
      Table-level Lock   동시성 저하
  2. Consistent 모드 블록 읽기 (Multi-Version Read Consistency Model)

    • 쿼리가 시작된 시점 1 을 기준으로 데이터를 읽음
      • 변경이 발생한 블록은(쿼리 SCN 4 보다 블록 SCN 3 이 큰 블록은) Current 블록 2 으로부터 CR 블록을 생성해서 읽는다.
        • ( Current 블록 2 : CR 블록 ) = ( 1 : N )
          • RAC 환경에서 Current 블록이 노드 숫자만큼 생길 수(캐싱될 수) 있으나, Exclusive 모드의 Current 블록은 한개다. (Shared(S), Exclusive(X), Null(N) 모드)
      • 시점 1 은 SCN 4 (System Commit Number) 로 식별 (v$database.current_scn) : 일관성, 동시성, Redo Log 정보 순서 식별, 데이터 복구
      • 블록 SCN 3 (System Change Number) : 블록이 마지막으로 변경된 시점 정보
  3. Consistent 모드 블록 읽기의 세부 원리

    • SCN 5 확인 후 읽기 작업을 한다.
      • SCN 5 : 쿼리 SCN or 스냅샷 SCN
      • Current 블록 SCN <= 쿼리 SCN 인 블록만 읽기 가능
    • Current 블록 상태에 따른 Consistent 모드 블록 읽기
      Current 블록 상태 SCN 상태 읽기 동작
      COMMITTED Current 블록 SCN <= 쿼리 SCN 바로 읽음
      COMMITTED Current 블록 SCN > 쿼리 SCN CR 블록 생성 후 읽음
      ACTIVE 쿼리 SCN 이전에 커밋됨 바로 읽음
      ACTIVE 쿼리 SCN 이후에 커밋 되었거나 커밋 안됨 CR 블록 생성 후 읽음
      • Current 블록 상태가 ACTIVE 인 경우, 오라클은 Delayed 블록 클린아웃 하기 때문에 트랜잭션 테이블 까지 확인을 해야 함.
      • CR 블록 생성에 필요한 Undo 정보가 없는 경우 ORA-1555 발생
  4. IMU (In-Memory Undo)

    • 장점
      • Undo 세그먼트 헤더 블록, Undo 세그먼트 블록 버퍼에 대한 래치 경합 및 Pinning 감소
      • In-memory undo latch (래치)
    • 파라미터 (10g)
      • _in_memory_undo : IMU 사용 여부 (TRUE / FALSE)
      • _imu_pools : IMU Pool 수
    • 동작
      1. Undo 데이터가 Undo 세그먼트가 아닌 Shared Pool 내의 IMU Pool <KTI-UNDO> 에 생성...
      2. IMU Pool 이 가득차면, 저장된 Undo 데이터를 Undo 세그먼트로 일괄 기록 (IMU Flush)
      3. 이후 Undo 데이터는 예전처럼 Undo 세그먼트에 저장
  5. DBA당 CR 개수 제한

    • _db_block_max_cr_dba (파라미터)
    • 블록당 6개 까지만 CR Copy를 허용 (가득 차면 오래된 CR Copy 부터 밀려남)
    • LRU 리스트에서 항상 LRU END 쪽에 위치 (메모리 부족시 가장 먼저 밀려남)

참조문서

블로그(오라클 성능 문제에 대한 통찰) : http://ukja.tistory.com/11
서적(오라클 성능 고도화 원리와해법 I) : http://book.daum.net/detail/book.do?bookid=KOR9788996246015

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.