COMMIT·ROLLBACK·SAVEPOINT로 트랜잭션을 확정·취소하고, DDL의 자동 COMMIT과 SAVEPOINT 흐름 계산, ACID를 기출 중심으로 익힙니다.
빈출기출 11회분 중 29문항 · 많이 나온 주제: 트랜잭션(19), COMMIT/ROLLBACK(15)
학습 목표
COMMIT·ROLLBACK·SAVEPOINT로 트랜잭션을 확정·취소하고, DDL의 자동 COMMIT과 SAVEPOINT 흐름 계산, ACID를 기출 중심으로 익힙니다.
01
TCL 한눈에 보기
TCL(Transaction Control Language)은 트랜잭션을 확정하거나 취소하는 명령입니다. 워드 문서에 비유하면 COMMIT은 저장 버튼(영구 반영), ROLLBACK은 되돌리기(취소), SAVEPOINT는 중간 임시 저장 지점(부분 취소)입니다.
트랜잭션은 '모두 반영되거나 모두 취소되어야 하는' 논리적 작업 단위입니다. 계좌 이체의 출금과 입금처럼 함께 성공하거나 함께 취소되어야 하는 DML을 하나로 묶습니다. COMMIT·ROLLBACK은 TCL이고, 권한을 다루는 GRANT·REVOKE는 DCL입니다.
개념 정리TCL 명령 세 가지
COMMIT
영구 반영
변경 확정 · 다른 사용자도 조회 · SAVEPOINT 모두 사라짐
ROLLBACK
전체 취소
마지막 COMMIT 이후 변경 모두 취소
SAVEPOINT
중간 지점 표시
ROLLBACK TO 지점으로 그 이후만 취소
트랜잭션의 흐름
성공
DML 누적→
SAVEPOINT (선택)→
COMMIT→
영구 반영
실패
DML 누적→
SAVEPOINT (선택)→
ROLLBACK→
마지막 COMMIT 시점으로
02
COMMIT과 ROLLBACK
COMMIT은 트랜잭션의 변경을 영구 반영합니다. COMMIT 전에는 변경한 본인 세션만 그 내용을 볼 수 있고, COMMIT 후에야 다른 사용자도 조회할 수 있으며 잠금(Lock)이 풀립니다. COMMIT한 변경은 ROLLBACK으로 되돌릴 수 없습니다.
ROLLBACK은 마지막 COMMIT 이후의 모든 변경을 취소합니다. 주의할 점은 DDL(CREATE·ALTER·DROP·TRUNCATE)은 실행할 때 자동 COMMIT된다는 것입니다. 그래서 DML 뒤에 DDL을 실행하면 앞의 DML까지 확정되어, 이후 ROLLBACK으로 되돌릴 수 없습니다.
ROLLBACK은 마지막 COMMIT 시점으로 되돌린다
마지막 COMMIT 직후
ID
NAME
101
A
DML→INSERT 102
INSERT · DELETE 후 (미확정)
ID
NAME
101
A
102
B
ROLLBACK→COMMIT 이후 전부 취소
ROLLBACK 후
ID
NAME
101
A
중간에 DDL이 끼면 앞의 DML은 확정된다
주문 0건
단계
주문 건수
시작
0
DML + DDL→DDL이 자동 COMMIT
INSERT 20건 → TRUNCATE 다른 테이블
단계
주문 건수
INSERT
20
TRUNCATE
20 확정
ROLLBACK→5건만 취소
INSERT 5건 → ROLLBACK
단계
주문 건수
INSERT
25
ROLLBACK
20
TRUNCATE는 다른 테이블에 실행했어도 DDL이라 그 순간 앞의 20건까지 COMMIT됩니다. ROLLBACK은 그 뒤 5건만 되돌립니다.
Oracle과 SQL Server의 차이
상황
Oracle
SQL Server
DML 실행 후
직접 COMMIT 해야 확정
기본 AUTO COMMIT
DDL 실행
자동 COMMIT
명시적 트랜잭션 안이면 ROLLBACK 가능
정상 종료
자동 COMMIT
—
비정상 종료
자동 ROLLBACK
—
03
SAVEPOINT
SAVEPOINT 이름으로 트랜잭션 중간에 지점을 표시하고, ROLLBACK TO 이름으로 그 지점 이후의 변경만 취소합니다. 지점 이전의 변경은 남고, 트랜잭션은 끝나지 않고 계속됩니다. ROLLBACK TO 뒤에 실행한 DML은 정상적으로 이어집니다.
같은 이름으로 SAVEPOINT를 다시 만들면 나중 지점이 앞 지점을 대신합니다. 또 COMMIT이나 전체 ROLLBACK을 하면 SAVEPOINT가 모두 사라져, 그 뒤의 ROLLBACK TO는 오류가 납니다. 오류가 난 그 문장만 실패하고, 앞에서 실행한 DML은 취소되지 않습니다.
첫 번째 A로 돌아갔다면 UPDATE까지 취소되어 10, 20, 30이 됩니다. 나중에 만든 같은 이름 지점이 기준입니다.
04
트랜잭션과 ACID
트랜잭션이 지켜야 할 네 가지 성질을 ACID라고 합니다. 원자성(Atomicity)은 모두 반영되거나 전혀 반영되지 않음(All or Nothing), 일관성(Consistency)은 실행 전후 무결성 규칙을 지킴, 고립성(Isolation)은 실행 중인 트랜잭션이 다른 트랜잭션의 영향을 받지 않음, 지속성(Durability)은 COMMIT한 결과가 영구히 보존됨입니다.
고립성을 얼마나 엄격히 지킬지는 격리 수준으로 정합니다. 낮은 수준일수록 다른 트랜잭션의 미확정 데이터를 읽는 Dirty Read 같은 문제가 생길 수 있습니다. Oracle의 기본값은 READ COMMITTED입니다.
개념 정리ACID
A
원자성 Atomicity
전부 또는 전무 (All or Nothing)
C
일관성 Consistency
실행 전후 무결성 유지
I
고립성 Isolation
다른 트랜잭션의 간섭을 받지 않음
D
지속성 Durability
COMMIT한 결과는 영구 보존
격리 수준 (낮음 → 높음)
격리 수준
읽는 데이터
생길 수 있는 문제
READ UNCOMMITTED
커밋 안 된 데이터도 읽음
Dirty Read
READ COMMITTED
커밋된 것만 (Oracle 기본)
Non-Repeatable Read
REPEATABLE READ
같은 행은 다시 읽어도 같음
Phantom Read
SERIALIZABLE
완전 격리 (가장 엄격)
—
보충 실습여기부터는 테이블을 직접 만들어 보는 긴 SQL 실습입니다. 처음 공부할 때는 건너뛰고, 위 내용을 이해한 뒤 돌아와도 됩니다.
05
SQL 실전: 계좌 이체로 SAVEPOINT 따라가기
보충 실습
빈 ACCOUNT에 두 계좌를 만들고 COMMIT한 뒤, 101에서 1,000을 빼서 102로 보내는 이체를 합니다. 중간에 없는 계좌(999)를 잘못 갱신했다가 SAVEPOINT로 그 부분만 되돌립니다.
-- 트랜잭션 1: 계좌 생성INSERTINTO ACCOUNT VALUES(101,'A',10000);INSERTINTO ACCOUNT VALUES(102,'B',5000);COMMIT;-- 트랜잭션 2: 이체 (중간에 실수)UPDATE ACCOUNT SET BALANCE = BALANCE -1000WHERE ID =101;SAVEPOINT BEFORE_DEPOSIT;UPDATE ACCOUNT SET BALANCE = BALANCE +1000WHERE ID =999;ROLLBACKTO BEFORE_DEPOSIT;-- 999 갱신만 취소UPDATE ACCOUNT SET BALANCE = BALANCE +1000WHERE ID =102;COMMIT;
시점별 잔액
시점
101 잔액
102 잔액
비고
첫 COMMIT 직후
10000
5000
UPDATE 101 (−1000)
9000
5000
출금
SAVEPOINT
9000
5000
지점 표시
UPDATE 999 (+1000)
9000
5000
대상 없음 (0행)
ROLLBACK TO
9000
5000
출금은 지점 이전이라 유지
UPDATE 102 (+1000)
9000
6000
입금
COMMIT
9000
6000
영구 반영
COMMIT 뒤에 앞서 만든 SAVEPOINT로 돌아가려 하면 오류입니다. 예를 들어 5행이 있는 테이블에 INSERT → SAVEPOINT S → INSERT → COMMIT → INSERT → ROLLBACK TO S를 실행하면, 마지막 문장만 오류가 나고 행은 8행 그대로입니다.