1. TRANSACTION (트랜잭션)

트랜잭션은 "하나의 논리적 작업 단위로 수행되는 일련의 작업"로 정의할 수 있다.
이 의미에는 "일련의 작업이 전부 되거나, 전부 되지 않거나"의 의미가 포함되어 있다.

단순히 이야기하면, "SQL의 묶음"이라고도 할 수 있다.

여러 SQL 쿼리문을 트랜잭션으로 묶어 (BEGIN TRAN)
트랜잭션이 성공하면 트랜잭션 동안 이루어진 일련의 작업 결과는 커밋되고 데이터베이스에 영구적으로 반영된다.
(COMMIT TRAN)
트랜잭션에 오류가 발생하여 취소되거나 롤백되면 일련의 작업 내역은 모두 취소된다.
(ROLLBACK TRAN)




2. COMMIT (커밋)


MSSQL은 디폴트로 자동 Commit을 한다.


Tools -> Options 에서 SET IMPLICIT_TRANSACTIONS를 체크해서 변경가능하나 거의 사용하지 않음.




DECLARE @tranName NVARCHAR(10) = N'TranName'


BEGIN TRAN @tranName

INSERT INTO Table1 (nvcCol1, bitIsCol2, dtCol3) values ('ABC', 1, GETDATE());

UPDATE Table1 SET nvcCol1 = 'GH', bitIsCol2 = 0, dtCol3 = GETUTCDATE() WHERE iID = 5;

COMMIT TRAN @tranName;


트랜잭션은 우선 트랜잭션 로그 파일(*.ldf)에 저장된다.
커밋하면 실제 데이터 파일(*.mdf)에 변경이 적용된다.

COMMIT / ROLLBACK 실행 이전까지 테이블 락이 잡혀서 외부에서 사용이 불가능함.


COMMIT / ROLLBACK 를 실행하지 않고 새로운 쿼리창에서 아래 SELECT문을 실행하면 잠금이 발생하여 하염없이 기다린다.


SELECT * FROM Table1;


COMMIT 되기전 변경된 데이터 상태를 보려면 뒤에 WITH (NOLOCK) 혹은 WITH (READUNCOMMITTED) 를 붙혀줘야 한다.




3. ROLLBACK (롤백)


ROLLBACK TRAN [@tranName]은 
트랜잭션의 시작점이나, 트랜잭션의 저장점으로 트랜잭션을 명시적으로 롤백시킨다.

주로, 트랜잭션의 예외 처리에 사용된다.
(BEGIN TRY/END TRY ... BEGIN CATCH/END CATCH)

TRY-CATCH 와 COMMIT/ROLLBACK 같이 사용한 예시.


+ Recent posts