SQLP 노트 정리본 📚
: 단일 SQL 수행 중 다른 트랜잭션이 데이터를 변경해도 일관성 있는 결과 리턴
1) 커밋되지 않은 값 읽기 허용 X
= Dirty Read 방지
2) 커밋 시점에 따라 다른 결과 리턴 X
of Multi-Version Read Consistency Model
1) Current Block : 원본 → Only one
2) CR Block : 복사본 → 여러 버전 OK
: 시점 정보를 담은 전역변수
1) 블록 SCN
: 블록의 마지막 변경 시점 in Block Header
(변경시킨 트랜잭션의 커밋 SCN)
2) 커밋 SCN
: 트랜잭션 별 커밋 번호 in ITL Slot
3) 쿼리 SCN
: 쿼리가 실행되는 시점의 DB 상태 (스냅샷 SCN)
블록 SCN이 쿼리 SCN보다 작거나 같은 블록만 읽을 수 있다.
(SCN 확인과정 필요)
A. Current Block SCN ≤ 쿼리 SCN
= 쿼리가 시작된 이후로 변경 없음
→ Current Block Read 즉, CR 생성하지 않고 그대로 읽음
*Current 모드 읽기 아님 주의!
B. Current Block SCN > 쿼리 SCN
= 쿼리가 시작된 이후로 변경 있음
→ CR Cloning 후, 쿼리 SCN보다 낮은 마지막 Committed 시점으로 Undo (ITL슬롯의 UBA 사용)
C. Current Block Status = Active
= 레코드에 Lock Byte 설정은 돼있는데, ITL슬롯에 아직 커밋 정보 기록 안됨
= 커밋 시 바로 클린아웃하지 않기 때문에, 갱신중이라고 단정할 수 없음
→ 블록 클린아웃 시도 ⇒ A or B
1) Consistent 모드로 갱신할 경우 (가정)
→ Lost Update 발생
2) Current 모드로 갱신할 경우 (다른 DBMS의 경우)
→ 갱신/삭제 중 다른 트랜잭션에 의해 갱신/삭제 대상이 변할 수 있음
3) Consistent 모드로 읽고, Current 모드로 갱신할 경우 (가정)
→ 잘못된 이중 갱신 발생
4) Consistent 모드로 갱신대상 식별하고, Current 모드로 갱신할 경우⭐
→ 갱신대상의 rowid 추출하고, 이 rowid와 조건절에 모두 해당되는 대상을 건건이 갱신
⇒ 갱신중에 갱신대상 범위에 새로 들어오지 못함
But, 갱신중에 갱신대상에서 제외될 수 있음
스칼라 서브쿼리는 일반적으로 Consistent 모드로 읽음
UPDATE A SET COL = A.a + (SELECT b FROM B)
But, 갱신해야할 테이블의 컬럼을 참조하는 경우 Current 모드로 읽음
UPDATE A SET COL = (SELECT A.a + B.b FROM B)
: 로우 Lock 해제 + 블록헤더에 커밋 정보 기록
Lock Byte -------------> ITL Entry
: 트랜잭션이 갱신한 블록 개수가 총 버퍼캐시 블록 개수의 1/10을 초과할 때, 커밋 이후 해당 블록을 액세스하는 첫 쿼리에 의해 완전히 정리
: 트랜잭션이 갱신한 블록 개수가 총 버퍼캐시 블록 개수의 1/10을 초과하지 않을 때, 커밋시점에 곧바로 불완전한 클린아웃을 수행
(ITL Slot에 커밋 정보만 저장)
→ 해당 블록을 갱신하는 다음 트랜잭션에 의해 완전히 클린아웃
즉, Current 모드로 읽는 시점에야 Lock Byte를 해제하고 Delayed Redo logging
참고 도서 : 오라클 성능 고도화 원리와 해법 1