공부/인프런 - Rookiss

Part 5-2-17. SQL 입문 : TRANSACTION, COMMIT/ROLLBACK

셩잇님 2024. 5. 13. 20:26
반응형

 

 

💅 SQL 입문

 

 지난 시간에는 JOIN을 통해 복수의 테이블에서 공통 열을 통해 테이블 정보를 살펴보는 내용에 대해서 알아보았다. 이번 시간에서는 TRANSACTION과 COMMIT, ROLLBACK 등 개념을 통해 테이터 처리 및 취소 여부에 대해 알아보는 시간을 가지자. 

 


 

📨 TRANSACTION

 

트랜잭션이란 무엇일까? 검색해보니 '더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.'라고 나와 있다. 개념적으로 학습하기에는 쉽게 이해가 되지 않으므로 예시를 통해 알아보자.

 

 예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 그러나 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 이는 하나의 거래내역으로 처리되어야 하는 단일 거래이다. 이런 거래의 최소 단위를 트랜잭션이라고 한다.

 

use BaseballData;

SELECT *
FROM teamshalf;

-- TRAN을 명시하지 않으면, 자동으로 COMMIT이 진행된다.
INSERT INTO teamshalf VALUES(1981, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);

 

 위 예제와 같이 TRAN을 명시하지 않으면 일반적으로 INSERT INTO를 통해 데이터를 넣는 처리가 진행된다. 따라서 트랜잭션은 BEGIN TRAN이라는 키워드를 통해 질의를 해야 한다.

 

-- 성공/실패 여부에 따라 COMMIT (=COMMIT을 수동으로 하겟다.)
BEGIN TRAN;
	INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL); 
ROLLBACK;

BEGIN TRAN;
	INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL); 
COMMIT;

 

 


 

📨 COMMIT

 

그렇다면 커밋은 무엇일까? 커밋은 트랜잭션의 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과정을 데이터베이스에 영구적으로 저장하는 것이다.

 

BEGIN TRAN;
	INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL); 
COMMIT;

 

 위와 사용할 수 있다.

 


 

📨 ROLLBACK

 

 커밋이 위와 같으니 롤백은 이와 반대되는 동작을 처리하는 것을 유추할 수 있다. 롤백 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어이다. 

 

BEGIN TRAN;
	INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL); 
ROLLBACK;

 

 마찬가지로 위와 같이 사용할 수 있다.


 

📨 응용

 

 SQL에서는 C#에서와 마찬가지로 try-catch문을 사용할 수 있다.

 

-- 응용
BEGIN TRY
	BEGIN TRAN;
		INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL); 
		INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL); 
	COMMIT;
END TRY
BEGIN CATCH
	IF @@TRANCOUNT > 0 -- 현재 활성화된 트랜잭션 수를 반환한다.
		ROLLBACK
END CATCH

 

 위와 같이 BEGIN TRY-BEGIN CATCH 문을 통해 작업중에 오류가 발생할 경우 CATCH문이 동작하게끔 설정할 수 있다.

 

 마지막으로 트랜잭션을 사용할 때 주의점이 있다. 바로 트랜잭션 내부에서 실행한 로직들은 꼭 원자적으로 실행할 수 있는 로직만 넣어서 사용하는 것이다.

 

 무슨말이고자 하니 C#으로 예를 들어보자. 게임 서버 시간에 우리는 원자적으로 값을 실행해 줄 때 Lock을 통해서 값을 설정해주었다. 왜냐하면 다른 스레드가 접근하여 값을 수정할 수 있었기 때문이다. 트랜잭션도 마찬가지이다. 내가 어떤 작업을 Commit/Rollback 하지 않고 혹은 오랜 시간 작업이 걸리는 로직을 처리하면 다른 쿼리문에서 질의를 던질 때 작업 완료가 정상적으로 되지 않았기 때문에 트랜잭션의 로직이 끝날 때 까지 대기할 수 밖에 없기 때문이다.

 

 

반응형