IT_DBMS/Oracle

트랜잭션(Transaction) Control Language - COMMIT, ROLLBACK

JJun ™ 2006. 3. 9. 14:48

데이터베이스에서 트랜잭션(Transaction)이란 논리적인 일의 단위를 말합니다.

개념적으로 설명하기에는 추상적이고 모호한 면이 많아 실례를 들어 설명하는 편이 훨씬 이해하기에 빠를 것입니다.

아래 그림을 보세요. 

 

 

사용자가 INSERT 문을 사용해 데이터를 삽입하고, UPDATE 문으로 데이터를 갱신하고, DELETE 문으로 데이터를 삭제하였다고 합시다. 만약 이 모든 과정이 오류없이 수행되었다면 지금까지 실행한 모든 작업을 '실제로' 수행하라는 명령을 내릴 수 있는데 이 때의 명령이 바로 'COMMIT' 명령입니다. 'COMMIT' 명령을 주기 전까지의 모든 작업은 'ROLLBACK' 명령으로 원상태로 되돌릴 수 있는 것입니다.
만약 INSERT 작업을 한 다음 'SAVEPOINT A'라는 명령을 실행하였다면 나중에 'ROLLBACK A'라는 명령을 통해 INSERT 작업을 한 그 위치로 되돌아 올 수 있는 것이죠. 그 전에 'COMMIT' 명령을 실행하지 않았다면 말입니다.
이와 같이 COMMIT 명령으로 하나의 작업이 성공적으로 끝났을 때 우리는 트랜잭션이 성공적으로 수행되었다고 말합니다.

트랜잭션 제어를 위한 명령어(Transaction Coltrol Language)에는

다음과 같은 것들이 있습니다.

  • COMMIT
  • SAVEPOINT
  • ROLLBACK


하나 하나 살펴볼까요?
  • COMMIT은 저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령입니다.
  • SAVEPOINT [이름]는 현재까지의 트랜잭션을 특정 이름으로 지정하라는 명령입니다.
  • ROLLBACK [TO  SAVEPOINT 이름]저장되지 않은 모든 데이터 변경 사항을 취소하고 현재의 트랜잭션을 끝내라는 명령입니다. 만약 이전에 SAVEPOINT로 지정한 이름이 있으면 그 위치까지 되돌아 갑니다.


이와 같이 COMMIT 또는 ROLLBACK 명령으로 직접 트랜잭션을 완성하거나 취소할 수도 있지만,
다음과 같은 경우에는 자동으로 트랜잭션이 종료됩니다.

  • DDL(CREATE, ALTER, DROP) 명령어를 실행할 때
  • DCL(GRANT, REVOKE) 명령어를 실행할 때
  • Deadlock같은 특정 Error를 만날 때
  • SQL*Plus를 종료할 때


위와 같은 경우에는 COMMIT나 ROLLBACK 문이 없어도 트랜잭션이 종료됩니다.

그럼, 정리하는 의미로 다음과 같이 작업을 할 경우 어떠한 결과가 나타날지 한번 생각해 보세요.

  1. SQL*Plus시작
  2. SELECT * FROM EMP;
  3. UPDATE EMP
    SET JOB_CODE = 'AA'
    WHERE EMP_NUM = '10001';
  4. SAVEPOINT update_point;
  5. DELETE FROM EMP;
  6. ROLLBACK TO update_point;
  7. DELETE FROM EMP
    WHERE JOB_CODE = 'SS';
  8. COMMIT;
  9. INSERT INTO CUSTOMER
    VALUES ('103',  손병목 , NULL, NULL, SYSDATE);