트랜잭션

트랜잭션 (T-SQL)

트랜잭션은 작업의 단일 단위예요. 트랜잭션이 성공하면 그동안 이루어진 모든 데이터 수정이 커밋되어 데이터베이스의 영구적인 일부가 되고, 오류를 만나 취소·롤백되면 모든 수정이 지워져요. SQL Server는 이 트랜잭션이 어떤 방식으로 시작·종료되는지에 따라 여러 동작 모드를 제공해요. 데이터 웨어하우스 제품(Fabric 데이터 웨어하우스, Azure Synapse Analytics)은 별도로 다뤄지는 점도 참고할게요.

출처: Transactions (Transact-SQL) - Microsoft Learn

트랜잭션 모드

SQL Server에서 동작하는 트랜잭션 모드는 네 가지예요.

트랜잭션 모드 설명
오토커밋 각 문장 하나가 트랜잭션 그 자체예요.
명시적 BEGIN TRANSACTION으로 명시적으로 시작하고, COMMIT이나 ROLLBACK으로 명시적으로 끝내요.
암시적 이전 트랜잭션이 끝나면 새 트랜잭션이 암시적으로 시작하지만, 각 트랜잭션은 COMMIT/ROLLBACK으로 명시적으로 끝내요.
배치 범위 여러 활성 결과 집합(MARS)에만 적용돼요. MARS 세션에서 시작된 T-SQL 명시적·암시적 트랜잭션은 배치 범위 트랜잭션이 되고, 배치가 끝날 때 커밋·롤백되지 않으면 SQL Server가 자동으로 롤백해요.

트랜잭션 제어 문법

SQL Database 엔진이 제공하는 트랜잭션 문장은 다음과 같아요.

  • BEGIN TRANSACTION — 트랜잭션 시작
  • COMMIT TRANSACTION / COMMIT WORK — 트랜잭션 확정
  • ROLLBACK TRANSACTION / ROLLBACK WORK — 트랜잭션 되돌림
  • SAVE TRANSACTION — 트랜잭션 안에 저장점(체크포인트) 설정
  • BEGIN DISTRIBUTED TRANSACTION — 분산 트랜잭션 시작

트랜잭션 상태를 다룰 때 함께 쓰이는 것으로, 암시적 트랜잭션을 켜고 끄는 SET IMPLICIT_TRANSACTIONS와 중첩 트랜잭션 수를 반환하는 @@TRANCOUNT 함수가 있어요. 특히 @@TRANCOUNT는 트랜잭션이 중첩될 때 현재까지 몇 개가 열려 있는지 확인해 롤백할 단위를 판단하는 데 유용해요.

간단한 명시적 트랜잭션은 대략 이렇게 생겼어요.

BEGIN TRANSACTION;
-- 여러 데이터 수정 문장이 이 사이에 들어가요
UPDATE Sales.SalesOrderHeader SET Status = 5 WHERE SalesOrderID = 43659;
COMMIT TRANSACTION;

COMMIT 대신 ROLLBACK TRANSACTION을 쓰면 앞선 수정이 모두 취소돼요.

더 알아보기