SQL/Oracle

Oracle 07. TCL ( Transaction Control Language )

shin96bc 2022. 3. 31. 23:44

(1) 설명 
     1)DML(insert, update, delete)문이 실행되어 DBMS에 '저장'되거나, '되돌리기'위해서 실행하는 SQL

 

(2) 트랜잭션(Transaction) 
     1) 정의 
          <1> 분리되어서는 안될 (논리적인) '작업 단위'

     2) 시작 
          <1> DBMS에 처음 접속했을 때 
          <2> 하나 or 여러개의 DML문을 실행한 후 commit 또는 rollback 한 직후 
          <3> DDL 이나 DCL 실행된 직후 

     3) 끝 
          <1> commit 또는 rollback 실행 직후 
          <2> DDL 이나 DCL 문이 실행 직후  
          <3> 세션이 종료 직후
               1> 정상
                    1. exit; 또는 quit;
                    2. commit 되고 종료

               2> 비정상
                    1. 오른쪽 상단이 X버튼 종료 
                    2. rollback 되고 종료 

          <4> 해당 세션에서 계정 변경 직후 
               1> conn system/java1234; ( commit; 된 후 계정이 변경됨 )
   
          <5> DB를 닫은 후 
               1> 세션1
                    1. sqlplus scott/tiger 
                    2. insert into dept values(50, 'a', 'b');
             
               2> 세션2  
                    1. sqlplus system/java1234 as sysdba
                    2. shutdown immediate
                    3. startup

               3> 세션3
                    1. sqlplus scott/tiger
                    2. select * from DEPT2 order by DEPTNO;

     4) 결과

          <1> 세션1 에서의 작업은 rollback 됨 

 

(3) TCL의 종류  
     1) commit; 
          DML문을 영구적으로 DBMS에 '반영'하는 SQL

     2) rollback; 
          DML문을 (이전 Transaction 끝분분) DBMS에 '취소'하는 SQL

     3) savepoint 
          <세션1>  
               ex) insert into dept values(50, 'a1', 'b1');
               ex) insert into dept values(60, 'a2', 'b2');
               ex) savepoint a;
               ex) insert into dept values(70, 'a3', 'b3');
               ex) savepoint b;
               ex) insert into dept values(80, 'a4', 'b4');
               ex) rollback to a;
               ex) commit;

          <참고> rollback to b; --안됨(이미늦음)


          <세션2> 
               ex) select * from DEPT2; --세션1> rollback to a; 후 
               ex) select * from DEPT2; --세션1> commit; 후 

 

(4) TCL 관련 특성
     1) Read Consistency ( 읽기 일관성 ) : '해당 row' 
          <1> 어떤 사용자(세션)가 변경중(트랜잰션진행중)인 '행'을 다른 사용자(세션)가 변경할 수 없게하는 현상   
               1> 세션1 -> update dept set dname='가' where deptno=50; --특정 행에 lock
               2> 세션2 -> update dept set dname='나' where deptno=50;
               3> 세션1 -> commit; 또는 rollback;
               4> 세션2 -> 1 행이 업데이트되었습니다
    
     2) Lock ( 잠금 ) : '해당 table'
          <1> 어떤 사용자(세션)가 변경중(트랜잰션진행중)인 '전체행'을 다른 사용자(세션)가 변경할 수 없게하는 현상
               1> 세션1 -> delete from dept2; --모든 행에 lock 
               2> 세션2 -> update dept2 set loc='나' where deptno=50;

     3)결론

          <1> Read Consistency 나 Lock 해제 방법: 진행중인 Transaction을 종료해야 함