2014년 2월 13일 목요일

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 레벨의 경우 트랜잭션 내의 모든 문장을 수행할 때, 트랜잭션 시작 시점의 데이터베이스 스냅샷을 보여준다는 것을 알수있다. [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=51 자바 오라클/빅데이터 아이폰/안드로이드 닷넷/WPF 표준웹/HTML5 채용/취업무료교육 초보자코스 [기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 총 5일 40시간 02-17 [기업100%환급]Spring ,MyBatis,Hibernate실무과정 총 5일 40시간 02-24 JAVA&WEB프레임워크실무과정 총 33일 99시간 02-25 Spring3.X, MyBatis, Hibernate실무과정 총 12일 36시간 03-03 [주말저녁]자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 총 18일 72시간 02-22 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 10일 70시간 03-01 JAVA&WEB프레임워크실무과정 총 14일 98시간 03-08 Spring3.X, MyBatis, Hibernate실무과정 총 5일 35시간 03-09 [기업100%환급]PL/SQL,ORACLE HINT,TUNING 총 5일 40시간 02-17 [기업100%환급]SQL기초에서 Schema Object까지 총 5일 40시간 02-24 SQL초보에서실전전문가까지 총 18일 54시간 02-18 SQL초보에서실전전문가까지 총 8일 56시간 02-22 [주말저녁]SQL기초에서 Schema Object까지 총 10일 40시간 03-01

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




댓글 없음:

댓글 쓰기