SQL: TCL

김기현·2025년 6월 18일

Database

목록 보기
19/24

TCL은 트랜잭션을 제어하기 위한 SQL명령어의 집합을 의미한다. 트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위이며, TCL은 이 트랜잭션을 완료하거나 취소하거나, 임시 저장하는 역할을 한다.

  • 완료: Commit
  • 취소: Rollback
  • 임시 저장: savepoint

목적

  • 데이터 일관성(consistency)유지
  • 동시성(concurrency) 제어
  • 복구 가능성(recoverability) 확보
  • 트랜잭션 단위로 작업을 원자적(atomic)으로 처리

트랜잭션의 4가지 성질

  • 원자성: 트랜잭션은 모두 수행되거나, 모두 실패해야 한다.
  • 일관성: 트랜잭션 수행 후 전후 데이터는 일관성 있는 상태를 유지해야 한다.
  • 고립성: 동시에 수행되는 트랜잭션은 서로 영향을 주지 않는다.
  • 지속성: 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이 유용한 경우

상황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; -- 전체 취소 (주문도 안 들어감)

복잡한 로직의 중간 저장이 필요할 때 (SAVEPOINT)

중간까지는 성공했지만, 이후의 단계에서 되돌리고 싶을 때

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하여 성능도 확보할 수 있다.

사용 시 주의점

  • 대부분의 DBMS는 자동 커밋 모드가 활성화되어있어서, INSERT, UPDATE등의 명령이 바로 커밋된다.
  • 따라서 복잡한 트랜잭션을 사용하려면 자동 커밋을 끄고, 수동으로 COMMIT, ROLLBACK을 명시해야 한다.
  • SAVEPOINTROLLBACK TO SAVEPOINT하위 트랜잭션 제어에 유용하다.

지원하는 DBMS

DBMSTCL 지원 여부비고
OracleOSAVEPOINT 매우 자주 사용
PostgreSQLO서브 트랜잭션 지원
MySQL? (InnoDB만)MyISAM은 트랜잭션 미지원
SQL ServerOBEGIN TRAN, COMMIT, ROLLBACK
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글