[Oracle] 오라클 다중 버전 읽기 일관성 모델, Multi-Version Read Consistency Model
"오라클의 다중 버전 읽기 일관성 모델(Multi-Version Read Consistency Model)은 완벽한 문장수준 읽기 일관성을 보장한다."
뭐래냐...
다중 버전 읽기 일관성 모델은 뭐고, 문장수준 읽기 일관성은 뭐지..?
누가 만들었는지 몰라도 말 참 어렵게 만들어 놨다.
일단 문장수준 읽기 일관성이 뭔지 알아보자.
* 문장수준 읽기 일관성이란
- 단일 SQL문이 수행되는 도중에 다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라도 일관성 있는 결과 집합을 리턴하는 것
음.. 저기서 말하는 '문장'이 SQL문의 '문장'을 의미하고 '읽기'라는 것은 SELECT를 의미하는 것 같구만.
다른 표현으로 'SQL문 단위의 읽기 일관성' 정도로 기억하면 쉬울 듯..
예를 들어 TX1에서 잔고를 SUM하는 쿼리를 수행하는 도중에 TX2에서 새로운 계좌번호와 잔고 데이터를 INSERT 하고 커밋한다면 데이터가 INSERT되는 위치에 따라 읽기 일관성이 보장되지 않을 수 있다. (이미 읽고 지나간 블록에 저장될 수도 있으니깐..)
그럼 다중 버전 읽기 일관성 모델이 뭐길래 오라클을 위와 같은 현상으로부터 벗어날 수 있게 해주는지 알아보자.
Consistent 모드 블록 읽기
Consistent가 『한결같은, 일관된』이란 뜻이므로 '일관된 모드로 읽으면 일관성이 보장된다' 는.. 알고보면 너무나 쉬운 이야기다.
그럼 위 그림을 살펴보자.
SCN이라는 생소한 단어가 두개나 보인다.
일단 SELECT문 아래에 123이라고 표시된 SCN은 System Commit Number로 시스템 전체적으로 공유되는 global 변수같은 존재다.
아래와 같은 쿼리로 확인이 가능하다.
SELECT CURRENT_SCN,
SYS.SCN_TO_TIMESTAMP (CURRENT_SCN)
FROM V$DATABASE;
그리고 각각의 블록 헤더에 있는 SCN은 System Change Number로 블록이 마지막으로 변경된 시점의 정보를 나타낸다.
위 그림을 요약하자면,
- 오라클은 쿼리가 시작된 시점을 기준으로 데이터를 읽어들임 (SCN 123)
- 쿼리가 시작되기 전에 커밋된 데이터 (SCN 121, 98, 111) → 그대로 읽음
- 쿼리가 시작된 이후에 커밋된 데이터 (SCN 138, 129) → 현재의 Current 블록으로부터 CR 블록을 생성하여 쿼리가 시작된 시점으로 되돌린 후 그것을 읽음
* Current 블록: 최종 버전의 커밋이 반영된 블록 (오직 하나만 존재)
* CR 블록: Current 블록에 대한 복사본(여러 버전 존재)
☞ 오라클 쿼리 수행 → 현재 SCN (System Commit Number) 값 확인(=쿼리 SCN or 스냅샷 SCN) → 확인된 쿼리 SCN을 들고다니며 읽는 블록마다 이전 버전인지를 체크
- Current 블록 SCN <= 쿼리 SCN & committed ▶ 그대로 읽음
- Current 블록 SCN > 쿼리 SCN & committed ▶ CR 블록 생성, Undo 레코드를 읽어 한 단계 이전 상태로 롤백한 후 읽음
- Current 블록이 Active 상태(갱신이 진행 중)로 표시 ▶ 트랜잭션 테이블로부터 커밋정보를 가져와 블록 클린아웃을 시도, 쿼리 SCN 이전에 커밋된 블록이면 그대로 읽고 이후에 커밋되거나 아직 커밋 전이라면 CR Copy 생성하여 롤백 후 읽음
* Snapshot too old : CR 블록을 과거 상태로 되돌리는 과정에서 필요한 Undo 정보가 덮어 쓰여져 계속 롤백을 진행할 수 없을 때 발생하는 에러
쿼리 SCN이 123이므로 CR 블록이 120으로 롤백되어야 할 것 같지만 120은 아직 커밋되지 않은 상태여서 118로 롤백됨
* UBA - Undo Block Address
"위와 같이 CR Copy 블록으로 복사해 읽기 일관성을 지원하는 오라클만의 독특한 메커니즘을 다중 버전 읽기 일관성 모델(Multi-Version Read Consistency Model) 이라고 한다."
깨우침
이제 자자..