ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle] TCL(Transaction Control Language)
    RDS/Oracle 2019. 2. 23. 10:29
    반응형

    트랜잭션(Transaction)이란?

     데이터베이스에서 트랜잭션은 데이터 처리의 한 단위입니다. 오라클에서 발생하는 여러 개의 SQL 명령문들을 하나의 논리적인 작업 단위로 처리하는데 이틀 트랜잭션이라고 합니다.

    하나의 트랜잭션은 ALL-OR_Nothing 방식으로 처리됩니다. 여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료하도록 하고 여러 개의 명령어 중에서 하나의 명령어라도 잘못되었다면 전체를 취소합니다.


    트랜잭션의 특성

    원자성(atomicity)

     - 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전행 실행되지 않은 상태로 남아 있어야 합니다.

    일관성(consistency)

     - 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안 됩니다.

    고립성(isolation)

     - 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안 됩니다.

    지속성(durability)

     - 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장됩니다.

     

    트랜잭션 제어를 위한 명령어

    COMMIT

     - 저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령입니다.  

    SAVEPOINT

     - 현재까지의 트랜잭션을 특정 이름으로 지정하라는 명령입니다.

    ROLLBACK

     - 저장되지 않은 모든 데이터 변경 사항을 취소하고 현재의 트랜잭션을 종료하라는 명령입니다.


    COMMIT, ROLLBACK 문

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    -- 1.현재 트랜잭션을 종료하기 위해서 COOMMIT 문을 실행합니다.
    COMMIT;
     
    -- 2.TEMP01_EMP 테이블의 내용을 조회합니다. 
    SELECT *
      FROM TEMP01_EMP;
     
    -- 3.DELETE 문을 실행하여 TEMP01_EMP에 모든 데이터를 삭제합니다. 
    DELETE
      FROM TEMP01_EMP;
     
    -- 4.특정 데이터만 삭제하려고 했는데 위에 같은 명령을 수행했다면 모든 데이터가 삭제되어 조회 시에 원하는 데이터를 찾을 수 없습니다.
    SELECT *
      FROM TEMP01_EMP;
      
    -- 5.DELETE 문을 실행하기 전 상태로 복구하기 위해서 ROLLBACK 문을 실행합니다.
    ROLLBACK;
     
    -- 6.ROLLBACK 문을 실행하면 DELETE 문을 실행하기 전 상태로 복구됩니다.
    SELECT *
      FROM TEMP01_EMP;
      
    -- 7.특정 데이터만 삭제한 후, 확인합니다.  
    DELETE 
      FROM TEMP01_EMP
     WHERE EMPNO = 7369
     
    SELECT *
      FROM TEMP01_EMP; 
      
    -- 8.삭제한 결과를 영구적으로 반영하기 위해서는 COMMIT 문을 실행합니다.
    COMMIT;  
    cs


    COMMIT과 ROLLBACK 데이터 상태 

    COMMIT이나 ROLLBACK 이전의 데이터 상태 

     - 단지 메모리 BUFFER에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구가 가능합니다.

     - 현재 사용자는 SELECT 문으로 결과를 확인 가능합니다.

     - 다른 사용자는 현재 사용자가 수행한 명령의 결과를 확인 할 수 없습니다.

     - 변경된 행은 잠근(LOCKING)이 설정되어서 다른 사용자가 변경할 수 없습니다.

     

    COMMIT 이후의 데이터 상태

     - 데이터에 대한 변경 사항이 데이터베이스에 반영됩니다.

     - 이전 데이터는 영구적으로 잃어버리게 됩니다.

     - 모든 사용자는 결과를 확인 할 수 있습니다.

     - 관련된 행에 대한 잠금(LOCKING)이 풀리고, 다른 사용자들이 행을 조작할 수 있습니다.


    ROLLBACK 이후의 데이터 상태 

     - 데이터에 대한 변경 사항은 취소됩니다.

     - 이전 데이터는 다시 복구됩니다.

     - 관련된 행에 대한 자금(LOCKING)이 풀리고, 다른 사용자들이 행을 조작할 수 있습니다.

     

    COMMIT이나 ROLLBACK 효과

     - 데이터 무결성을 보장할 수 있습니다.

     - 영구적이 변경을 하기 전에 데이터의 변경 사항을 확인 할 수 있습니다.

     - 논리적으로 연관된 작업을 그룹핑하여 처리가 가능합니다.

      

    SAVEPOINT 문

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    -- 1.EMPNO가 7369인 데이터를 삭제하기 전에 SAVEPOINT A를 설정합니다.
    SAVEPOINT A;
     
    DELETE 
      FROM TEMP01_EMP
     WHERE EMPNO = 7369
     
    -- 2.EMPNO가 7499인 데이터를 삭제하기 전에 SAVEPOINT B를 설정합니다.
    SAVEPOINT B;
     
    DELETE 
      FROM TEMP01_EMP
     WHERE EMPNO = 7499;  
     
    -- 3.EMPNO가 7499를 삭제하기 전 상태로 ROLLBACK 후, 확인합니다.
    ROLLBACK TO B;
     
    SELECT *
      FROM TEMP01_EMP;
      
    -- 4.EMPNO가 7369인 삭제하기 전 상태로 ROLLBACK 후, 확인합니다.
    ROLLBACK TO A;
     
    SELECT *
      FROM TEMP01_EMP;
    cs


     - SAVEPOINRT A를 실행하고 나서 SAVEPOINT B를 실행할 수는 없습니다. 일단 특정 저장저맊지 롤백하면 그 저장점 이후에 설정한 저장점은 무효가 되기 때문입니다. 즉, 'ROLLBACK TO A'를 실행한 시점에서 저장점 A 이후에 정의한 저장점 B는 존재하지 않습니다. 저장점 지정 없이 "ROLLBACK"을 실행했을 경우 반영안된 모든 변경 사항을 취소하고 트랜잭션 시작 위치로 되돌아갑니다.

    반응형

    댓글

Designed by Tistory.