Oracle Consistent 모드 vs Current 모드

지니·2022년 8월 31일
0

SQLP (SQL 전문가)

목록 보기
21/21

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 모드로 이루어진다.
profile
Coding Duck

0개의 댓글