TCL은 트랜잭션을 제어하기 위한 SQL명령어의 집합을 의미한다. 트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위이며, TCL은 이 트랜잭션을 완료하거나 취소하거나, 임시 저장하는 역할을 한다.
COMMIT된 변경사항은 시스템에 장애가 발생해도 지속된다.| 명령어 | 설명 |
|---|---|
COMMIT | 현재 트랜잭션에서 수행한 모든 변경사항을 영구적으로 저장한다, |
ROLLBACK | 현재 트랜잭션에서 수행한 모든 변경사항을 취소하고 원래 상태로 되돌린다. |
SAVEPOINT | 트랜잭션 내에서 롤백할 수 있는 중간 지점을 설정한다. |
ROLLBACK TO SAVEPOINT | 특정 세이브포인트까지 트랜잭션을 롤백한다. |
SET TRANSACTION | 트랜잭션의 격리 수준(Isolation Level) 등을 설정한다. (선택적으로 지원됨) |
BEGIN; -- 자동으로 시작됨
INSERT INTO users
VALUES (1, 'kim');
SAVEPOINT sp1;
INSERT INTO users
VALUES (2, 'lee');
ROLLBACK TO sp1; -- lee 삽입은 취소되고, kim은 유지됨
COMMIT; -- kim은 최종 저장됨
| 상황 | TCL이 필요한 이유 |
|---|---|
| 하나의 작업 단위로 여러 SQL 실행 | 원자성 보장 (Atomicity) |
| 오류 발생 시 전체 취소 | 일관성 유지 (Consistency) |
| 중간 지점부터 롤백 | 세부적인 제어 가능 (SAVEPOINT) |
| 동시 처리 중 충돌 예방 | 격리성 제어 (Isolation) |
| 대규모 배치 처리 | 성능 + 안전성 확보 |
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
UPDATE accounts
SET balance = balance + 100
WHERE id = 2;
위 두 개의 명령이 하나의 송금 작업이라고 할 때, 한쪽만 실행되면 데이터가 꼬인다. 이럴 때 실패 시 ROLLBACK을 통해 모두 취소할 수 있다.
BEGIN;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
UPDATE accounts
SET balance = balance + 100
WHERE id = 2;
COMMIT; -- 모두 성공해야 커밋
사용자가 여러 단계를 거쳐 데이터를 입력하는 중, 중간에 에러가 발생했다면 전체 작업을 취소해야 할 수 있다.
BEGIN;
-- 1단계
INSERT INTO orders (...)
VALUES (...);
-- 2단계
INSERT INTO order_items (...)
VALUES (...); -- 여기에서 오류 발생
ROLLBACK; -- 전체 취소 (주문도 안 들어감)
중간까지는 성공했지만, 이후의 단계에서 되돌리고 싶을 때
BEGIN;
UPDATE inventory
SET stock = stock - 10
WHERE item_id = 100;
SAVEPOINT step1;
UPDATE customers
SET points = points + 100
WHERE customer_id = 1;
-- 여기에서 오류가 발생했고 step1로 되돌리고 싶다.
ROLLBACK TO step1; -- 재고 감소는 유지, 포인트는 무효화
COMMIT;
여러 사용자가 동시에 같은 데이터를 수정하려고 할 때, 트랜잭션과 격리 수준을 통해 충돌을 예방할 수 있다.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 격리 수준 수정
BEGIN;
-- 동시에 같은 상품 재고 수정할 때 충돌 방지
COMMIT;
수천 건의 데이터를 업데이트해야 할 때, 중간에 실패하면 전체 작업을 ROLLBACK할 수 있고 성공하면 한 번에 COMMIT하여 성능도 확보할 수 있다.
INSERT, UPDATE등의 명령이 바로 커밋된다.COMMIT, ROLLBACK을 명시해야 한다.SAVEPOINT와 ROLLBACK TO SAVEPOINT는 하위 트랜잭션 제어에 유용하다.| DBMS | TCL 지원 여부 | 비고 |
|---|---|---|
| Oracle | O | SAVEPOINT 매우 자주 사용 |
| PostgreSQL | O | 서브 트랜잭션 지원 |
| MySQL | ? (InnoDB만) | MyISAM은 트랜잭션 미지원 |
| SQL Server | O | BEGIN TRAN, COMMIT, ROLLBACK |