06 문장수준 읽기 일관성.

문장수준 읽기 일관성 (Statement-Level Read Consistency)
트랜잭션 수준 읽기 일관성 (Transaction-Level Read Consistency)

문장수준 읽기 일관성

단일 SQL문이 수행되는 도중에 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라고 일관성있는 결과집합을리턴하는 것.

읽기 일관성 구현


ORACLE     : UNDO     :  ORA-1550
다른 RDBMS  : Row Lock :  일관성, 동시성 문제

계좌번호12345678910
잔고1,0001,0001,0001,0001,0001,0001,0001,0001,0001,000

TX1> select sum(잔고) from 계좌
TX2> update 계좌 set 잔고 = 잔고 + 100 계좌번호 = 7; 1번
TX2> update 계좌 set 잔고 = 잔고 - 100 계좌번호 = 3; 2번

 1. TX1 : 2번 계좌까지 읽는다.
 2. TX2 : 1번을 UPDATE 을 실행한다.
 3. TX1 : 6번 계좌까지 읽는다
 4. TX2 : 2번을 UPDATE 하고 Commit 한다
 5. TX1 : 10번 계좌까지 읽어내려간다.

Table Lock 을 이용한 읽기 일관성 문제. (Other rdbms)

트랜잭션 고립화 수준방식문제
Level1, Read Committed (기본)값을 읽는 순간 Shared Lock값을 읽는 순간에만 Shared Lock을 걸었다가 다음 레코드로 이동할 때 Lock을 해제되므로 이미 읽고 지나간 레코드를 다른 트랜잭션이 변경가능.
Level2, Repeatable Read트랜잭션동안 Shared Lock동시성저하, 교착상태 Dead lock 발생
Consistent 모드 블록 읽기

Current 블록은 디스크로 부터 읽어진 사용자의 갱신사항이 반영된 최종상태의 원본 블록
CR (Consistent read)블록은 Current 블록의 복사본(여러버젼이 존재 가능).

RAC 환경에서는 Shared 환경의 Current 블록이 있을 수 있으나 Exclusive 모드의 Current 블록은 하나만 존재한다. Shared 모드의 Current 블록이 여러 있더라고 변경이 일어나면 Exclusive 으로 Upgrade 일어나면서 다른 Current 블록은 Null 로 Downgrade 가 일어난다.

Consistent 모드 읽기 : 쿼리가 시작된 시점 기준값 ( SQL_TRACE : Query , AUTO_TRACE : Consistent gets)
Current 모드 읽기 : 찾아간 시점의 최종값 ( SQL_TRACE : Current , AUTO_TRACE : db_block_gets )


 SCN 는 시간정보를 이용해 데이터베이스의 일관성 있는 상태 유지하는데 사용되는 Gobal변수. 
      ( 읽기 일관성, 동시정제어, 생성된 REDO 로그 정보 순서 식별, 데이터 복구에 이용.)

 쿼리 SCN(System commit number) : 쿼리가 시작한 시점의 SCN 넘버.
 블록 SCN(System change number) : 블록이 마지막으로 갱신된 시점.

 Current 블록 SCN <= 쿼리 SCN 이며, committed 상태
 Current 블록 SCN > 쿼리 SCN 이며, committed 상태
 Current 블록 Active 상태, 즉 갱신중 인것으로 표시 하고 있을때 

 다중 버전 일기 일관성 모델 (Multi Version read Consistency Model)  

 Snapshot too old가


IMU (In-Memory Undo)


 _imu_pools ( in memory undo pools )
 _in_memory_undo ( Make in memory undo for top level transactions )

 POOL         NAME                            BYTES
 ------------ -------------------------- ----------
 shared pool  KTI-UNDO                      1901664

 
 UNDO 세그먼트 헤더 블록과 UNDO 세그먼트 블록 버퍼에 대한 래치 경합 및
 Pinning 을 줄일 수 있다.
 관련된 Latch : In_memory_undo_latch

DBA 의 CR 블록 제한.


_db_block_max_cr_dba                = 6 
   ( Maximum Allowed Number of CR buffers per dba )

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