데이터베이스 with MSSQL/SQL 입문
TRANSACTION
코다람쥐
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을 실행시키는 예외처리 방법이다.