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