코다람쥐 2022. 4. 11. 13:58

1. 필요성

COMMIT과 ROLLBACK을 통해 원자성을 보장받을 수 있다.

만약 TRANSACTION을 선언하지 않으면 한 문장이 끝날 때 마다 자동으로 COMMIT이 이루어진다.

COMMIT은 작성한 코드를 데이터베이스에 갱신을 하겠다는 뜻이다.

ROLLBACK은 작성한 코드를 COMMIT이 이루어진 지점 전까지 취소를 하겠다는 뜻이다.

 

한 가지 주의할 점은 TRANSACTION을 사용할 때는 꼭 원자적으로 실행될 구문만 넣어야한다.

TRANSACTION이 사용되는 동안 ROLLBACK이나 COMMIT이 되기 전까지는 다른 연산은 모두 멈추게 된다.

이는 마치 C#에서 lock을 사용하는 것과 같다. 이렇게 lock을 걸어놓는 행위는 성능적인 이슈가 발생할 수 있기 때문에 마구 남용해서는 안된다.

 

2. 사용

BEGIN TRAN; -- BEGIN TRANSACTION으로도 사용가능
	INSERT INTO accounts VALUES(3, 'CODA2', 100, GETUTCDATE());
COMMIT;

BEGIN TRAN;
	INSERT INTO accounts VALUES(2, 'CODA', 100, GETUTCDATE());
ROLLBACK;

COMMIT한 구문은 데이터베이스에 반영이 되어있고 ROLLBACK한 구문은 데이터베이스에 반영되어 있지 않음을 알 수 있다.

 

3. 응용

BEGIN TRY
	BEGIN TRAN;
		INSERT INTO accounts VALUES(4, 'CODA4', 100, GETUTCDATE());
		INSERT INTO accounts VALUES(5, 'CODA5', 100, GETUTCDATE());
	COMMIT;
END TRY
BEGIN CATCH
	IF @@TRANCOUNT > 0 -- 현재 활성화된 트랜잭션 수를 반환
		ROLLBACK
END CATCH

C#에 있는 try~catch구문과 매우 유사하다.

만약에 2개의 INSERT INTO 구문 중에서 하나가 처리되지 않았다면 CATCH구문에서 ROLLBACK을 실행시키는 예외처리 방법이다.