[SQLD] 13. TCL (트랜잭션 제어어)

TJK·2025년 8월 5일

TCL (트랜잭션 제어어)

TCL(Transaction Control Language)은 DML(INSERT, UPDATE, DELETE)로 조작된 데이터 변경 사항을 하나의 논리적인 작업 단위인 트랜잭션(Transaction)으로 묶어 제어하는 명령어임. 데이터의 일관성과 무결성을 보장하는 안전장치 역할을 함.


1. 트랜잭션 (Transaction)의 개념

트랜잭션은 '더 이상 쪼갤 수 없는 논리적인 작업의 최소 단위'를 의미함. 여러 DML 작업이 하나의 트랜잭션으로 묶여 '모두 성공하거나, 하나라도 실패하면 모두 실패(All or Nothing)'하는 원칙을 따름.

  • 시작: 첫 DML 문장이 실행될 때 트랜잭션이 시작됨 (Oracle 기준).
  • 종료: COMMIT 또는 ROLLBACK 명령어를 만나거나, DDL/DCL이 실행될 때 종료됨.

1.1 트랜잭션의 ACID 특성 (SQLD 핵심 개념)

데이터베이스 트랜잭션이 안전하게 수행되기 위해 반드시 보장해야 할 4가지 특성.

특성영문명설명실무 예시 (계좌 이체)
원자성Atomicity트랜잭션의 모든 작업이 완전히 성공하거나, 하나라도 실패하면 모두 실패하여 이전 상태로 복구됨. (All or Nothing)출금과 입금 중 하나라도 실패하면, 모든 작업이 취소됨.
일관성Consistency트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상 일관성 있는 상태를 유지해야 함. (예: 제약조건, 규칙 위반 안 됨)이체 후에도 두 계좌의 총액은 이체 전과 동일해야 함.
고립성/격리성Isolation하나의 트랜잭션이 실행되는 동안, 다른 트랜잭션의 작업이 끼어들거나 영향을 줄 수 없음.A가 B에게 이체하는 동안, C는 이체 과정의 중간 금액을 볼 수 없음.
지속성/영속성Durability성공적으로 완료된 트랜잭션의 결과는 시스템 장애가 발생해도 영구적으로 데이터베이스에 저장되어야 함.COMMIT된 이체 내역은 서버가 다운되어도 사라지지 않음.

2. TCL 주요 명령어

2.1 COMMIT

  • 현재 트랜잭션 내에서 수행된 모든 DML 작업의 변경 사항을 데이터베이스에 영구적으로 저장함.
  • COMMIT 이후에는 ROLLBACK으로 되돌릴 수 없음.

2.2 ROLLBACK

  • 현재 트랜잭션 내에서 수행된 모든 DML 작업의 변경 사항을 모두 취소하고, 마지막 COMMIT 시점의 상태로 되돌림.
-- 시나리오: 101번 학생의 포인트를 5000점 차감하고, 수강신청 기록을 추가하는 트랜잭션
-- DML #1: 포인트 차감
UPDATE Student SET point = point - 5000 WHERE student_id = 101;

-- DML #2: 수강신청 기록 추가
INSERT INTO Enrollment (enroll_id, student_id, course_id) VALUES (201, 101, 1);

-- 상황 1: 모든 작업 성공
COMMIT; -- 변경 사항을 영구 저장

-- 상황 2: DML #2에서 오류 발생
ROLLBACK; -- DML #1, #2 작업을 모두 취소하고 포인트 원상 복구

2.3 SAVEPOINT

  • 긴 트랜잭션 내에 중간 저장 지점을 설정함.
  • ROLLBACK 시 전체 트랜잭션을 취소하는 대신, 특정 SAVEPOINT까지만 작업을 되돌릴 수 있게 함.
-- DML #1
INSERT INTO Enrollment ... ;
-- DML #2
INSERT INTO Enrollment ... ;

SAVEPOINT sp1; -- 중간 저장 지점 'sp1' 설정

-- DML #3 (실수!)
INSERT INTO Enrollment ... ;

ROLLBACK TO SAVEPOINT sp1; -- DML #3 작업만 취소됨. DML #1, #2는 유지.

COMMIT; -- 최종적으로 DML #1, #2 작업만 저장됨.

3. DDL과 자동 커밋 (Auto Commit) - (SQLD 핵심 함정)

Oracle 데이터베이스에서는 DML과 DDL의 상호작용에 매우 중요한 규칙이 있음.

  • CREATE, ALTER, DROP 등 DDL 명령어를 실행하면, 그 이전에 수행된 후 아직 COMMIT되지 않은 DML 작업들이 자동으로 COMMIT 처리됨.
  • DCL(GRANT, REVOKE) 명령어 또한 자동 커밋을 유발함.

이로 인해 DML 작업 중 실수로 DDL을 실행하면, 이전 작업을 ROLLBACK 할 수 없는 상황이 발생할 수 있음.

-- 1. 실수로 모든 강좌의 가격을 0으로 변경 (DML)
UPDATE Course SET price = 0;

-- 2. DML 작업을 되돌리기 전에, 무심코 테스트 테이블 생성 (DDL)
CREATE TABLE Temp_Test (id NUMBER);

-- 3. 실수를 깨닫고 ROLLBACK 시도
ROLLBACK;
-- 결과: ROLLBACK이 동작하지 않음.
-- 이유: CREATE TABLE 실행 시점에 이전의 UPDATE 문이 자동으로 COMMIT 되었기 때문.

4. 시험 문제 유형 및 함정 포인트

  • ACID 특성: 각 특성(원자성, 일관성, 고립성, 지속성)의 개념과 의미를 정확히 묻는 문제가 자주 출제됨.
  • COMMIT/ROLLBACK의 범위: ROLLBACK은 마지막 COMMIT 시점 이후의 모든 DML 작업을 취소한다는 점을 이해해야 함.
  • SAVEPOINT 동작: ROLLBACK TO SAVEPOINT 실행 시, 해당 SAVEPOINT 이후의 작업만 취소된다는 점과, SAVEPOINT 자체는 사라지지 않는다는 점을 알아야 함.
  • 자동 커밋(Auto Commit): DML 작업 후 DDL이나 DCL을 실행했을 때, 이전 DML이 ROLLBACK 될 수 있는지 묻는 시나리오 문제가 출제됨. 이는 SQLD의 대표적인 함정 문제 유형임.
  • TRUNCATE와의 관계: DDL인 TRUNCATEROLLBACK이 불가능하지만, DML인 DELETEROLLBACK이 가능하다는 점을 TCL과 연계하여 묻는 문제가 나옴.

5. DBMS별 문법 차이

  • 자동 커밋(Auto Commit) 설정:
    • Oracle: 기본적으로 자동 커밋이 비활성화되어 있어, 사용자가 명시적으로 COMMIT을 해야 함. (단, DDL/DCL 실행 시 예외적으로 자동 커밋 발생)
    • MySQL, SQL Server: 기본적으로 각 DML 문장이 실행될 때마다 자동 커밋이 활성화된 상태일 수 있음. (autocommit 모드) 이 경우, 여러 DML을 하나의 트랜잭션으로 묶으려면 START TRANSACTION 과 같은 명령어로 명시적으로 트랜잭션을 시작해야 함.
  • SQLD 시험은 주로 Oracle의 동작 방식을 기준으로 출제되므로, DDL/DCL에 의한 자동 커밋 개념을 숙지하는 것이 중요함.
profile
Hello world!

0개의 댓글