TCL(Transaction Control Language)은 DML(INSERT, UPDATE, DELETE)로 조작된 데이터 변경 사항을 하나의 논리적인 작업 단위인 트랜잭션(Transaction)으로 묶어 제어하는 명령어임. 데이터의 일관성과 무결성을 보장하는 안전장치 역할을 함.
트랜잭션은 '더 이상 쪼갤 수 없는 논리적인 작업의 최소 단위'를 의미함. 여러 DML 작업이 하나의 트랜잭션으로 묶여 '모두 성공하거나, 하나라도 실패하면 모두 실패(All or Nothing)'하는 원칙을 따름.
COMMIT 또는 ROLLBACK 명령어를 만나거나, DDL/DCL이 실행될 때 종료됨.데이터베이스 트랜잭션이 안전하게 수행되기 위해 반드시 보장해야 할 4가지 특성.
| 특성 | 영문명 | 설명 | 실무 예시 (계좌 이체) |
|---|---|---|---|
| 원자성 | Atomicity | 트랜잭션의 모든 작업이 완전히 성공하거나, 하나라도 실패하면 모두 실패하여 이전 상태로 복구됨. (All or Nothing) | 출금과 입금 중 하나라도 실패하면, 모든 작업이 취소됨. |
| 일관성 | Consistency | 트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상 일관성 있는 상태를 유지해야 함. (예: 제약조건, 규칙 위반 안 됨) | 이체 후에도 두 계좌의 총액은 이체 전과 동일해야 함. |
| 고립성/격리성 | Isolation | 하나의 트랜잭션이 실행되는 동안, 다른 트랜잭션의 작업이 끼어들거나 영향을 줄 수 없음. | A가 B에게 이체하는 동안, C는 이체 과정의 중간 금액을 볼 수 없음. |
| 지속성/영속성 | Durability | 성공적으로 완료된 트랜잭션의 결과는 시스템 장애가 발생해도 영구적으로 데이터베이스에 저장되어야 함. | COMMIT된 이체 내역은 서버가 다운되어도 사라지지 않음. |
COMMITCOMMIT 이후에는 ROLLBACK으로 되돌릴 수 없음.ROLLBACKCOMMIT 시점의 상태로 되돌림.-- 시나리오: 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 작업을 모두 취소하고 포인트 원상 복구
SAVEPOINTROLLBACK 시 전체 트랜잭션을 취소하는 대신, 특정 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 작업만 저장됨.
Oracle 데이터베이스에서는 DML과 DDL의 상호작용에 매우 중요한 규칙이 있음.
CREATE, ALTER, DROP 등 DDL 명령어를 실행하면, 그 이전에 수행된 후 아직 COMMIT되지 않은 DML 작업들이 자동으로 COMMIT 처리됨.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 되었기 때문.
COMMIT/ROLLBACK의 범위: ROLLBACK은 마지막 COMMIT 시점 이후의 모든 DML 작업을 취소한다는 점을 이해해야 함.SAVEPOINT 동작: ROLLBACK TO SAVEPOINT 실행 시, 해당 SAVEPOINT 이후의 작업만 취소된다는 점과, SAVEPOINT 자체는 사라지지 않는다는 점을 알아야 함.ROLLBACK 될 수 있는지 묻는 시나리오 문제가 출제됨. 이는 SQLD의 대표적인 함정 문제 유형임.TRUNCATE와의 관계: DDL인 TRUNCATE는 ROLLBACK이 불가능하지만, DML인 DELETE는 ROLLBACK이 가능하다는 점을 TCL과 연계하여 묻는 문제가 나옴.COMMIT을 해야 함. (단, DDL/DCL 실행 시 예외적으로 자동 커밋 발생)autocommit 모드) 이 경우, 여러 DML을 하나의 트랜잭션으로 묶으려면 START TRANSACTION 과 같은 명령어로 명시적으로 트랜잭션을 시작해야 함.