1. Consistent 모드 읽기
- SCN 확인 과정을 거치며 쿼리가 시작된 시점을 기준으로 일관성 있는 상태로 블록을 액세스하는 것
- SQL 트레이스 Call 통계의 query 항목, AutoTrace에서의 consistent gets
2. Current 모드 읽기
- SQL문이 시작된 시점이 아니라 데이터를 찾아간 바로 그 시점의 최종 값을 읽으려고 블록을 액세스하는 것
- SQL 트레이스 Call 통계의 current 항목, AutoTrace에서의 db block gets
3. 실습
1) 테이블 생성
create table 계좌1
nologging
as
select 7788 계좌번호, 'JIN' 계좌명, 1000 잔고 from dual;
create table 계좌2
nologging
as
select 7788 계좌번호, 'JIN' 계좌명, 1000 잔고, 2000 총잔고 from dual;
alter table 계좌1 add constraint 계좌1_PK primary key (계좌번호);
alter table 계좌2 add constraint 계좌2_PK primary key (계좌번호);
계좌1

계좌2

1) 실습 1
세션 1
update 계좌1 set 잔고 = 잔고 + 100 where 계좌번호 = 7788; -- 1100
update 계좌2 set 잔고 = 잔고 + 200 where 계좌번호 = 7788; -- 1200
- 두 쿼리를 실행하고 commit하지 않는다. 이 상태에서 다른 세션에서 다른 update문을 날린다.
세션 2
update 계좌2
set 총잔고 = 계좌2.잔고 + (select 잔고 from 계좌1 where 계좌번호 = 계좌2.계좌번호)
where 계좌번호 = 7788;
- 계좌번호가 7788인 row에 lock이 걸린 상태에서 세션 1에서 커밋하면 세션 2의 update문도 수행된다.
결과

- 위 순서대로 실행시킨 결과 총잔고는 2200이 나온다.
- 계좌2.잔고 = 1200
-> Current모드로 읽게 되어 세션1에서 commit한 이후의 값을 읽은 것이다.
- 계좌1의 잔고 = 1000
-> select문은 Consistent 모드로 읽게 되어 세션1에서 commit하기 전의 값인 1000을 읽는 것이다.
2) 세션2에서 다른 쿼리를 수행한다면?
update 계좌2
set 총잔고 = (select 잔고 + 계좌2.잔고 from 계좌1 where 계좌번호 = 계좌2.계좌번호)
where 계좌번호 = 7788;
- 위 쿼리와의 차이점은 계좌2.잔고를 select문 안으로 넣었다.
결과

- 위 순서대로 실행시킨 결과 총잔고는 2300이 나온다.
- 계좌1.잔고(1100)와 계좌2.잔고(1200) 모두 current 모드로 읽었기 때문에 일관성 있게 갱신되었다.
- current 모드로 읽힐 계좌2의 잔고가 서브쿼리로 들어가게 되면서 스칼라 서브쿼리 또한 current 모드로 동작하게 된다. (원래 스칼라 서브쿼리는 consistent 모드로 읽는다.)
정리
- 오라클은 update문 수행 시 대상 레코드를 읽을 때는 Consistent 모드로 읽고 실제 값을 변경할 때는 Current 모드로 읽는다.
- select문은 Consistent 모드로 읽고, insert, update, delete, merge는 Current 모드로 읽고 쓴다.
- 다만, 갱신할 대상 레코드를 식별하는 작업은 Consistent 모드로 이루어진다.