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 레벨의
경우 트랜잭션 내의 모든 문장을 수행할 때, 트랜잭션 시작 시점의 데이터베이스 스냅샷을 보여준다는 것을 알수있다.
댓글 없음:
댓글 쓰기