TCL·트랜잭션 완벽 정리
SQLD 시험 출제 범위의 트랜잭션 개념과 COMMIT·ROLLBACK·SAVEPOINT를 예시와 함께 정리
1. 트랜잭션이란?
정의
트랜잭션(Transaction)이란 데이터베이스의 논리적 작업 단위입니다. 하나의 트랜잭션에 포함된 연산들은 모두 성공하거나 모두 실패해야 합니다. 예를 들어 계좌이체 시 출금과 입금은 하나의 트랜잭션으로 묶여야 합니다.
트랜잭션의 시작과 종료
- 시작 — 첫 번째 DML(INSERT/UPDATE/DELETE) 실행 시 자동 시작
- 정상 종료 — COMMIT 실행 시
- 비정상 종료 — ROLLBACK 실행 또는 시스템 장애 시
2. ACID 속성
4가지 속성
| 속성 | 영문 | 설명 |
|---|---|---|
| 원자성 | Atomicity | All or Nothing — 전부 성공 또는 전부 실패 |
| 일관성 | Consistency | 트랜잭션 전후로 데이터베이스가 일관된 상태 유지 |
| 격리성 | Isolation | 동시 실행 트랜잭션이 서로 영향을 주지 않음 |
| 지속성 | Durability | COMMIT된 결과는 영구적으로 보존 |
ACID 4가지 속성과 각 설명을 매칭하는 문제가 자주 출제됩니다.
ACID 상세 설명
- 원자성(Atomicity) — 계좌이체에서 출금은 성공했는데 입금이 실패하면 안 됩니다. 출금도 ROLLBACK하여 전부 취소해야 합니다.
- 일관성(Consistency) — 이체 전 두 계좌의 합이 100만원이었다면 이체 후에도 100만원이어야 합니다. 제약조건, 트리거 등을 통해 보장합니다.
- 격리성(Isolation) — A가 이체하는 동안 B가 같은 계좌를 조회해도 중간 상태가 보이지 않습니다. 격리 수준(Read Uncommitted ~ Serializable)에 따라 차이가 있습니다.
- 지속성(Durability) — COMMIT 완료 후 시스템 장애가 발생해도 변경 내용은 유지됩니다. 리두 로그(Redo Log) 등을 통해 복구합니다.
3. COMMIT
COMMIT이란?
트랜잭션의 변경사항을 데이터베이스에 영구적으로 반영하는 명령어입니다. COMMIT 이후에는 ROLLBACK으로 되돌릴 수 없습니다.
INSERT INTO EMP VALUES (1, '김철수', 10);
UPDATE EMP SET SALARY = 5000 WHERE EMP_ID = 1;
COMMIT; -- 위 INSERT, UPDATE가 영구 반영
COMMIT의 효과
- 1. 변경사항 영구 저장 — 디스크에 기록되어 복구 불가
- 2. 다른 사용자에게 변경 내용 공개 — COMMIT 전에는 현재 세션에서만 변경 내용 확인 가능
- 3. 잠금(Lock) 해제 — 해당 행/테이블에 대한 잠금이 풀림
- 4. SAVEPOINT 소멸 — COMMIT 시 트랜잭션 내 SAVEPOINT가 모두 사라짐
4. ROLLBACK
ROLLBACK이란?
트랜잭션의 변경사항을 취소하고 이전 상태로 되돌리는 명령어입니다. 마지막 COMMIT 시점 또는 특정 SAVEPOINT까지 되돌릴 수 있습니다.
DELETE FROM EMP WHERE DEPT_ID = 10;
ROLLBACK; -- DELETE 취소, 데이터 복구
ROLLBACK의 효과
- 1. 변경사항 취소 — 마지막 COMMIT 이후의 모든 DML 작업 취소
- 2. 잠금(Lock) 해제 — COMMIT과 마찬가지로 잠금 해제
- 3. 데이터 원상복구 — 변경 전 상태로 완전히 복원
5. SAVEPOINT
SAVEPOINT란?
트랜잭션 내에 중간 저장점을 설정하여, 전체가 아닌 특정 지점까지만 ROLLBACK할 수 있게 하는 기능입니다.
INSERT INTO EMP VALUES (1, '김철수', 10);
SAVEPOINT SP1;
UPDATE EMP SET SALARY = 5000 WHERE EMP_ID = 1;
SAVEPOINT SP2;
DELETE FROM EMP WHERE EMP_ID = 2;
ROLLBACK TO SP2; -- DELETE만 취소
ROLLBACK TO SP1; -- UPDATE + DELETE 취소
ROLLBACK; -- 전부 취소 (INSERT 포함)
Oracle vs SQL Server SAVEPOINT 구문
| 동작 | Oracle | SQL Server |
|---|---|---|
| 저장점 생성 | SAVEPOINT SP1 | SAVE TRANSACTION SP1 |
| 저장점 복귀 | ROLLBACK TO SP1 | ROLLBACK TRANSACTION SP1 |
SAVEPOINT 주의사항
- 1. ROLLBACK TO SP2 후 SP2 이후의 SAVEPOINT는 무효 — SP3가 있었다면 SP3는 사라짐
- 2. COMMIT 시 모든 SAVEPOINT 소멸 — COMMIT하면 저장점으로 되돌릴 수 없음
- 3. 같은 이름의 SAVEPOINT는 덮어씀 — 이전 SAVEPOINT가 새 위치로 이동
6. 자동 COMMIT이 되는 경우
자동 COMMIT 상황 정리
| 상황 | 설명 |
|---|---|
| DDL 실행 | CREATE, ALTER, DROP, TRUNCATE, RENAME 실행 시 이전 DML도 함께 COMMIT |
| DCL 실행 | GRANT, REVOKE 실행 시 자동 COMMIT |
| 정상 종료 | SQL*Plus, 프로그램 정상 종료 시 자동 COMMIT |
| 비정상 종료 | 시스템 장애, 강제 종료 시 자동 ROLLBACK |
DDL 실행 시 이전 DML이 자동 COMMIT되는 것은 시험 필수 암기 포인트입니다!
DDL과 트랜잭션 예시
INSERT INTO EMP VALUES (1, '김철수', 10);
CREATE TABLE TEMP (ID NUMBER); -- DDL 실행!
ROLLBACK; -- INSERT는 이미 자동 COMMIT → 되돌릴 수 없음
DDL 실행 전에 COMMIT되지 않은 DML이 있으면 자동으로 COMMIT됩니다.
7. Oracle vs SQL Server 트랜잭션 차이
핵심 차이 비교
| 항목 | Oracle | SQL Server |
|---|---|---|
| 트랜잭션 시작 | DML 실행 시 자동 시작 | AUTO COMMIT이 기본 (BEGIN TRAN으로 명시 시작) |
| AUTO COMMIT | 기본 OFF (수동 COMMIT 필요) | 기본 ON (각 문장 자동 COMMIT) |
| SAVEPOINT | SAVEPOINT / ROLLBACK TO | SAVE TRANSACTION / ROLLBACK TRANSACTION |
| DDL ROLLBACK | 불가 (AUTO COMMIT) | 가능 (BEGIN TRAN 내에서) |
SQL Server에서는 BEGIN TRANSACTION 안에서 DDL도 ROLLBACK 가능 — Oracle과의 핵심 차이!
SQL Server 트랜잭션 예시
BEGIN TRANSACTION;
INSERT INTO EMP VALUES (1, '김철수', 10);
CREATE TABLE TEMP (ID INT);
ROLLBACK; -- INSERT와 CREATE 모두 취소 가능!
8. 시험 빈출 포인트
반드시 알아야 할 포인트
- 1. ACID 속성 매칭 — 원자성/일관성/격리성/지속성 설명을 정확히 구분할 수 있어야 함
- 2. DDL 실행 시 이전 DML 자동 COMMIT — CREATE/ALTER/DROP 등 DDL 실행 전 미커밋 DML이 영구 반영됨
- 3. Oracle AUTO COMMIT OFF vs SQL Server ON — Oracle은 수동 COMMIT 필요, SQL Server는 기본 자동 COMMIT
- 4. SQL Server에서 DDL ROLLBACK 가능 — BEGIN TRAN 내에서 DDL도 되돌릴 수 있음 (Oracle은 불가)
- 5. ROLLBACK TO SAVEPOINT 후 이후 SAVEPOINT 무효 — SP1으로 돌아가면 SP2, SP3는 사라짐
- 6. COMMIT 후 ROLLBACK 불가 — COMMIT하면 변경사항이 영구 반영되어 되돌릴 수 없음
- 7. 정상 종료 = COMMIT, 비정상 종료 = ROLLBACK — 프로그램 종료 방식에 따라 트랜잭션 처리가 다름
- 8. TRUNCATE는 DDL이므로 AUTO COMMIT — DELETE(DML)와 달리 ROLLBACK 불가
개념을 확인했다면 문제로 실력을 검증해보세요