본문 바로가기

카테고리 없음

ORACLE 10g Transaction v1.0

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이 변경된 걸 확인하였다.)