개요
SQL 시작시점이 아닌 실제 블록을 액세스하는 그 시점의 최종값을 읽는 Current Mode 상태에서 update를 수행하는 방법을 예제를 통해 안내합니다.
참고
Consistent Mode VS Current Mode 비교
Consistent Mode | Current Mode | |
명칭
(SQL trace) | Query
| Current |
명칭
(tbSQL autotrace) | consistent gets | db block gets |
정의 | TSN 확인 과정을 거치며 읽기 일관성이 보장된 상태에서 데이터 블록을 읽는 모드 | 실제 블록을 액세스하는 그 시점의 최종값을
읽는 모드 |
특징 | - 대부분의 SELECT 쿼리가 해당
- 쿼리가 시작된 시점을 기준으로 일관성
있게 읽음
- 읽는 도중에 값이 바뀌더라도 쿼리 시작
시점의 값으로 읽음 | 주요 발생 경우
- DML 또는 디스크 소트가 필요할 정도의
대용량 정렬 시
- SELECT FOR UPDATE 수행 시
- table full scan 시 대상 세그먼트의 익스텐트
정보를 읽을 시 |
방법
예제 테이블 데이터 생성
drop table acc1;
create table acc1(accno number, amt number, tamt number);
insert into acc1 select level, 1000, 2000 from dual connect by level <= 100000;
ALTER TABLE acc1 ADD CONSTRAINT PK_acc1_accno PRIMARY KEY(accno);
exec dbms_stats.gather_table_stats('TIBERO','ACC1',estimate_percent=>100,method_opt=>'FOR ALL
COLUMNS SIZE 254');
SQL
복사
Current 모드로 읽기 작업 수행
•
계좌.잔고를 Current 모드로 읽습니다.
•
update 중 계좌.잔고에 변경이 발생하면 영향을 받습니다 ( 현재 값 사용)
update 계좌
set 총잔고 = 잔고
where 계좌번호=7788;
SQL
복사
아래 실행 예제에서 Session B 의 UPDATE 구문을 통해 계좌.총잔고는 1100 (current 읽기 모드 수행) 이 됩니다.
No. | Session A | Session B |
1 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1000 2000 | |
2 | SQL> update acc1
set amt=amt+100
where accno=7788; | |
3 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1100 2000 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1000 2000 |
4 | SQL> update acc1
set tamt=amt
where accno=7788; | |
5 | (no.2) 에서 발생한 row lock
(acc1 테이블의 accno=7788 에 해당하는 row대기) | |
6 | SQL> commit; | |
7 | - (no.6)commit 이후에 update 수행
- 위에서 amt 컬럼은 update 대상 row 이므로,
current 읽기 모드 수행 (amt 값은 1100 사용)
| |
8 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1100 2000 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1100 1100 |
9 | SQL> commit; | |
10 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1100 1100 | SQL> select amt, tamt
from acc1
where accno=7788;
AMT TAMT
---------- ----------
1100 1100 |