문장수준 읽기 일관성 (Statement-Level Read Consistency)
트랜잭션 수준 읽기 일관성 (Transaction-Level Read Consistency)
문장수준 읽기 일관성
단일 SQL문이 수행되는 도중에 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라고 일관성있는 결과집합을리턴하는 것.
읽기 일관성 구현
ORACLE : UNDO : ORA-1550
다른 RDBMS : Row Lock : 일관성, 동시성 문제
계좌번호 | 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 |
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 발생 |
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_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
_db_block_max_cr_dba = 6
( Maximum Allowed Number of CR buffers per dba )
블록당 6개 까지만 CR Copy를 허용 (가득 차면 오래된 CR Copy 부터 밀려남)
LRU 리스트에서 항상 LRU END 쪽에 위치 (메모리 부족시 가장 먼저 밀려남)