2014년 2월 13일 목요일

SET TRANSACTION 명령은 고립수준과 일기전용 또는 읽기쓰기와 같은 트랜잭션의 다양한 속성을 설정 가능 하게 한다. [구로디지털단지 오라클교육학원강의강좌,오엔제이프로그래밍실무교육학원]

SET TRANSACTION 명령은 고립수준과 일기전용 또는 읽기쓰기와 같은 트랜잭션의 다양한 속성을 설정 가능 하게 한다. [구로디지털단지 오라클교육학원강의강좌,오엔제이프로그래밍실무교육학원]

SET TRANSACTION READ ONLY : 현재의 트랜잭션을 ReadOnly로 설정 한다.
SET TRANSACTION READ WRITE : 현재의 트랜잭션을 Read Write로 설정 한다. 이 값은 default 이다.

--------------------------------------------------------------------

트랜잭션의 독립성 레벨 지정은 아래의 두갖 방법을 이용한다. READ COMMITTED 값이 기본값이다.

1. SET TRANSACTION  ISOLATION LEVEL SERIALIZABLE : 트랜잭션 내의 모든 문장을 수행할 때, 트랜잭션 시작 시점의 데이터베이스 스냅샷을 보여준다.

SQL> set transaction isolation level serializable; 
SQL> select sum(sal) from emp;
SQL> ……
SQL> select sum(sal) from emp;
SQL> commit;

이 경우는 첫 번째 select 문의 수행 시작 시점의 데이터베이스 스냅샷 값을 기준으로 두 문장 모두 같은 sum() 값을 구하게 된다. 즉 다른 사용자가 emp의 sal을 변동 시켜도 그 값은 반영되지 않는 다는 의미이다.


2. SET TRANSACTION  ISOLATION LEVEL READ COMMITTED : read committed 레벨의 경우 읽기 일관성이 문장 단위로 해당 문장의 수행 시작 시점을 기준으로 제공된다. 예를 들어, 다음과 같이 한 트랜잭션 내에서 똑 같은 SELECT 문을 두 번 수행하게 되면 서로 다른 sum() 값이 나올 수가 있다.

SQL> set transaction isolation read committed;
SQL> select sum(sal) from emp;
SQL> ……
SQL> select sum(sal) from emp;
SQL> commit;
즉, read commit 레벨은 트랜잭션 개별 문장의 수행 시작 시점의 스냅샷을 보여준다. 


=========================================== 예제1
SQL> delete from emp;

15 행이 삭제되었습니다.

SQL> rollback;

롤백이 완료되었습니다.

SQL> set transaction read only;

트랜잭션이 설정되었습니다.

SQL> delete from emp;
delete from emp
*
1행에 오류:
ORA-01456: READ ONLY 트랜잭션은 삽입/삭제/갱신할 수 없습니다


SQL> commit;

커밋이 완료되었습니다.

SQL> set transaction read write;

트랜잭션이 설정되었습니다.

SQL> delete from emp;

15 행이 삭제되었습니다.

SQL> rollback;

롤백이 완료되었습니다.


==================================================== 독립성 레벨 예제
SQL> set transaction isolation level read committed;

트랜잭션이 설정되었습니다.

SQL> select sum(sal) from emp;

  SUM(SAL)
----------
    33025


--> 이때 다른 곳에서 scott 계정으로 접속하여 sal값을 변동한다. 예를들어 다음과 같은 SQL문장을  수행 한다고 가정 하다. update emp set sal = sal + 1000 where ename='SMITH' 라고 말이다...

SQL> select sum(sal) from emp;

  SUM(SAL)
----------
    34025
--> 값이 변했음을 알수있다. 즉 읽기 일관성이 문장 단위로 해당 문장의 수행 시작 시점을 기준으로 제공된다는것을 알수 있다. 아래에서 serializable에 대해 살펴보자.

SQL> set transaction isolation level SERIALIZABLE;

트랜잭션이 설정되었습니다.

SQL> select sum(sal) from emp;

  SUM(SAL)
----------
    34025

--> 이때 다른 곳에서 scott 계정으로 접속하여 sal값을 변동한다. 예를들어 다음과 같은 SQL문장을  수행 한다고 가정 하다. update emp set sal = sal + 1000 where ename='SMITH' 라고 말이다...


SQL> select sum(sal) from emp;

  SUM(SAL)
----------
    34025

--> 값이 변하지 않았음을 알수 있다. serializable 레벨의 경우 트랜잭션 내의 모든 문장을 수행할 때, 트랜잭션 시작 시점의 데이터베이스 스냅샷을 보여준다는 것을 알수있다.




댓글 없음:

댓글 쓰기