더북(TheBook)

06 | COMMIT과 ROLLBACK, TRUNCATE

COMMIT과 ROLLBACK

COMMIT은 변경한 데이터를 데이터베이스에 마지막으로 반영하는 역할을, ROLLBACK은 그 반대로 변경한 데이터를 변경하기 이전 상태로 되돌리는 역할을 한다.

    COMMIT [WORK] [TO SAVEPOINT 세이브포인트명] ;

    ROLLBACK [WORK] [TO SAVEPOINT 세이브포인트명] ;

UPDATE, INSERT, MERGE, DELETE문을 실행하면 데이터에 변화가 생긴다. 하지만 영구적으로 변경되는 것은 아니다. SQL Developer에서 다음 문장을 실행해 보자.

입력

    CREATE TABLE ex3_4 (
           employee_id NUMBER);

결과

    table EX3_4이(가) 생성되었습니다.

입력

    INSERT INTO ex3_4 VALUES (100);

결과

    1개 행 이(가) 삽입되었습니다.

입력

    SELECT *
      FROM ex3_4;

결과

    EMPLOYEE_ID
    -------------
            100

이제 SQL*Plus나 다른 툴로 로그인을 해 테이블을 다시 조회해 보자.

그림 3-1 COMMIT 전

조회된 데이터가 하나도 없다. 왜 이런 것일까? 오라클을 비롯한 RDBMS 시스템은 트랜잭션 기능을(트랜잭션에 대해서는 10장에서 자세히 다룰 것이다)지원하는데, COMMIT이나 ROLLBACK문을 실행하기 전까지 변경된 데이터는 현재 세션에만 볼 수 있고 최종적으로 데이터베이스에 반영된 상태가 아니다. 따라서 다른 세션에서 보면 ex3_4 테이블에 데이터가 없는 것이다. COMMIT을 실행하면 데이터가 반영되고 ROLLBACK을 실행하면 변경 이전 상태로 복귀한다. 그럼 COMMIT 문을 실행해 보자.

입력

    COMMIT;

결과

    커밋되었습니다.
그림 3-2 COMMIT 후

TRUNCATE문

데이터를 삭제할 때는 DELETE문을 사용하는데 이와 같은 기능을 수행하는 문장이 바로 TRUNCATE문이다. DELETE문은 데이터를 삭제한 후에 COMMIT을 실행해야 데이터가 완전히 삭제되고, 반대로 ROLLBACK을 실행하면 데이터가 삭제되기 전으로 복귀된다. 하지만 DDL문에 속하는 TRUNCATE문은 한번 실행하면 데이터가 바로 삭제되고 ROLLABCK을 실행하더라도 삭제 전 상태로 복귀되지 않는다. 또한 TRUNCATE문에는 WHERE 조건을 붙일 수 없다. 즉 테이블 데이터 전체가 바로 삭제된다. 복구할 방법이 없으므로 TRUNCATE문을 사용할 때는 항상 주의를 기울여야 한다.

    TRUNCATE TABLE [스키마명.]테이블명;

또한 TRUNCATE문은 DELETE문처럼 WHERE 절을 붙여 특정 조건에 해당되는 데이터만 삭제할 수는 없으며 테이블에 있는 데이터 전체를 삭제하므로, TRUNCATE 문을 실행할 때는 항상 신경을 써야 한다.

입력

    TRUNCATE TABLE ex3_4;

결과

    table EX3_4이(가) 잘렸습니다.

지금까지 SQL 문장에 대해 알아 보았다. 데이터를 다룰 때 SELECT, INSERT, UPDATE, MERGE, DELETE문이 전부라고 해도 과언이 아니다. 기본 구조는 그리 복잡하지 않으므로 많은 연습을 통해서 몸에 익혀 두자. 그리고 이제 앞에서도 조금씩 언급했던 SQL 문장을 구성하는 요소에 대해 살펴 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.