ORACLE 10g Transaction
from René Nyffenegger's collection of things on
the web |
http://www.adp-gmbh.ch/ora/concepts/scn.html
1. Transaction 의 정의
A.
하나의 일을 완수하기 위한 일련의
작업들이다. 예를 들어 내 구좌에서 계좌이체를 한다고 할 때 차감된 구좌와 가감된 구좌에 대한 작업이
하나의 트랜잭션이라 할 수 있다.
2. Transaction 의 제어
A.
commit
i.
SCN을 생성하고
리드로그 엔트리를 디스크에 내려쓰며 SCN 을 온라인 리두로그파일에 저장한다. 또한 SESSION이 잡고 있던 LOCK을 RELEASE 한다.
B.
rollback
[ to savepoint ]
i.
변경된 작업을 원래 트랜잭션의 시작
시점으로 되돌린다. 이 작업은 트랜잭션의 규모에 따라 작업시간이 늘어난다.
ii.
savepoint
를 지정한 경우 rollback to
savepoint_name 구문으로 일부시점까지만 rollback을 수행 할 수 있다. 긴 트랜잭션의 경우 유용하다.
C.
set
transaction
i.
트랜잭션의 성격을 셋팅한다.
ii.
모드 ( set transaction + [below option] )
1.
read
only
A.
읽기전용 상태이다. 해당 세션은 해당 시점의 DB상태를 보장받는다. 이 모드로 셋팅한 이후엔 타 세션에서 삭제 후 COMMIT 을 수행하더라도 SCN에 근거한 과거의 데이터를 읽을 수 있다.
2.
read
write
A.
DB의 기본셋팅이다.
3.
isolation
level serializable
A.
read
only 모드에 dml 이 추가된
옵션이다.
4.
isolation
level read committed
A.
serializable
모드에서 위 명령을 수행하면 default (
read write ) 상태로 돌아간다.
D.
set
constraint
E.
/*+
***ORACLE 9i FUND 찾아보고 제약조건 생성 옵션들 재확인 이후에
작성*** */
3. 예제
A. SCN의 조회
아래의 쿼리는 현재의 SCN을 조회하는 쿼리이다.
SQL> select
dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
613205
SQL> /
GET_SYSTEM_CHANGE_NUMBER
------------------------
613226
SCN을 변경은
시간이 흘러도 일어난다.
OTN 에서는 이 값을 EVER - INCREASING 한 값이라고 표현하였다.
위의 쿼리와 달리 최근의 CHECKPOINT로 적용된 SCN을 조회하는 방법은 아래와 같다.
SQL> select name, checkpoint_change#
2 from v$database;
NAME
CHECKPOINT_CHANGE#
--------- ------------------
PROD 600971
SQL> commit;
Commit complete.
SQL> select name, checkpoint_change#
2 from v$database;
NAME
CHECKPOINT_CHANGE#
--------- ------------------
PROD 600971
(commit이 일어난다고 scn 이 바로 변경된 내용을
확인하진 못한다. REDO LOG 에 SCN을 쓰는것과 DB FILE에 적용하는 것은 별개의 일이기 때문이다.)
SQL> update scott.emp set sal = 3333
2 where empno = 7788;
1 row updated.
SQL> commit;
Commit complete.
SQL> select name,checkpoint_change#
2 from v$database;
(DML 수행후에 commit 해도 위와 같은 이유로
변경된 SCN 을 확인할 수 없었다.)
NAME
CHECKPOINT_CHANGE#
--------- ------------------
PROD 600971
SQL> alter system checkpoint;
System altered.
(CHECKPOINT을 발생시켜 물리적으로 동기화 시켰다.)
SQL> select name,checkpoint_change#
2 from v$database;
NAME
CHECKPOINT_CHANGE#
--------- ------------------
PROD 613378
( SCN이 변경된 것을 확인하였다. )
SQL> alter system checkpoint;
System altered.
SQL> select name,checkpoint_change#
2 from v$database;
NAME
CHECKPOINT_CHANGE#
--------- ------------------
PROD 613385
( DML 없이 CHECKPOINT 만 발생시켜도 SCN이 변경된 걸 확인하였다.)