2과목 · SQL 기본 및 활용·5장
TCL (COMMIT / ROLLBACK / SAVEPOINT)
트랜잭션 제어 SQL의 세부 동작, 묵시적 커밋 상황, SAVEPOINT 흐름을 정리합니다.
1. TCL이란
TCL(Transaction Control Language) 은 트랜잭션의 경계를 정하고 확정·취소하는 명령 집합입니다. 핵심은 COMMIT, ROLLBACK, SAVEPOINT.
2. COMMIT
현재 트랜잭션의 모든 변경을 영속화합니다. 커밋이 완료되면 다른 세션도 변경사항을 볼 수 있습니다.
BEGIN;
INSERT INTO orders (id, amount) VALUES (1, 100);
COMMIT;
3. ROLLBACK
현재 트랜잭션의 모든 변경을 취소합니다.
BEGIN;
UPDATE account SET balance = balance - 10000 WHERE id = 'A';
-- 앗, 금액이 틀렸다
ROLLBACK;
4. SAVEPOINT와 부분 ROLLBACK
긴 트랜잭션 중 부분적 취소가 필요할 때 사용.
BEGIN;
INSERT INTO orders (id, amount) VALUES (1, 100);
SAVEPOINT after_first;
INSERT INTO orders (id, amount) VALUES (2, -50); -- 잘못된 값
ROLLBACK TO SAVEPOINT after_first; -- 두 번째 INSERT만 취소
COMMIT; -- 첫 번째는 살아남음
- SAVEPOINT는 이름을 붙여 여러 개 선언 가능.
ROLLBACK TO SAVEPOINT name은 해당 지점 이후의 변경만 취소.- 트랜잭션이
COMMIT또는 전체ROLLBACK되면 모든 SAVEPOINT는 사라짐.
5. 묵시적 커밋
특정 SQL은 자동으로 트랜잭션을 종료시킵니다.
DDL은 자동 커밋 (Oracle)
BEGIN;
INSERT INTO log (msg) VALUES ('step 1');
CREATE TABLE tmp (id INT); -- 이 순간 INSERT가 묵시적으로 COMMIT됨
ROLLBACK; -- 이미 커밋돼서 INSERT는 되돌릴 수 없음
DCL도 자동 커밋
GRANT/REVOKE를 실행하면 직전 DML이 커밋됩니다.
DBMS별 차이
- Oracle: 기본적으로 수동 커밋. DDL/DCL은 묵시적 커밋.
- MySQL: 기본 자동 커밋.
SET autocommit=0으로 끌 수 있음. - PostgreSQL: 기본 자동 커밋.
BEGIN으로 명시 트랜잭션 시작.
6. 세션 종료 시
세션이 정상 종료되면 현재 트랜잭션은 COMMIT됩니다 (Oracle). 세션이 비정상 종료되면 ROLLBACK 됩니다.
7. READ ONLY 트랜잭션
읽기만 하는 트랜잭션임을 선언해 옵티마이저 힌트와 일관성을 확보.
SET TRANSACTION READ ONLY;
SELECT ...
SELECT ...
COMMIT;
8. 자주 출제되는 포인트
- DDL/DCL은 묵시적 커밋. 그래서 DDL 이후의 ROLLBACK은 효과가 없다.
- SAVEPOINT는 부분 취소를 위한 지점. 전체 ROLLBACK과 다름.
- 세션 정상 종료 = COMMIT / 비정상 종료 = ROLLBACK (Oracle).
- ROLLBACK은 현재 열린 트랜잭션만 취소 (이미 커밋된 것은 되돌릴 수 없음).
9. 요약 체크리스트
- COMMIT / ROLLBACK의 역할을 한 줄로 설명할 수 있다.
- SAVEPOINT와 ROLLBACK TO의 사용 흐름을 쓸 수 있다.
- DDL/DCL의 묵시적 커밋 성격을 안다.
- DBMS별 기본 auto-commit 설정 차이를 안다.