대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(2) 데이터베이스

SQL (15) - TRANSACTION

monstro 2025. 2. 18. 11:52
728x90
반응형

이번 포스트에서는 SQL에서의 TRANSACTION에 대해 알아보겠습니다.

 

1) TRANSACTION이란?

https://learn.microsoft.com/ko-kr/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16

 

트랜잭션(Transact-SQL) - SQL Server

트랜잭션(Transact-SQL)

learn.microsoft.com

 

트랜잭션하나의 작업 단위를 의미합니다.
트랜잭션이 성공하면 트랜잭션 중에 수행된 모든 데이터의 수정 사항이 COMMIT됩니다.
또는 중간에 오류가 발생하여 취소 또는 ROLLBACK 하는 경우모든 데이터 수정 사항이 취소됩니다.

TRANSACTION을 수행하기 위한 연산자들은 다음과 같습니다.

  • TRANSACTION 시작 : BEGIN TRAN / BEGIN TRANSACTION
  • 수정 사항을 실제 데이터에 반영 : COMMIT
  • 수정 사항을 반영하지 않음 : ROLLBACK

이제 예제를 통해 TRANSACTION을 어떻게 사용하는지 알아보겠습니다.

 

1) TRASACTION 수행

-- 트랜잭션을 수행하되, ROLLBACK하여 수정사항을 반영하지 않음
BEGIN TRAN;
	INSERT INTO accounts VALUES(1, 'Kim', 100, GETUTCDATE());
ROLLBACK;

-- 트랜잭션을 수행하고 성공하면 수동으로 COMMIT함(COMMIT을 명시함)
BEGIN TRAN;
	INSERT INTO accounts VALUES(2, 'Kim2', 100, GETUTCDATE());
COMMIT;

 

2개의 쿼리문을 위와 같이 구성하였습니다.

위의 쿼리문트랜잭션을 수행하되, ROLLBACK하여 수정사항을 반영하지 않습니다.

 

아래의 쿼리문트랜잭션을 수행하고 COMMIT을 작성하여 수동적으로 COMMIT을 수행합니다.

TRANSACTION 안에서의 작업이 성공하면 자동으로 COMMIT되지만,

이해를 돕기 위해 위와 같이 수동으로 COMMIT 하도록 작성하였습니다.

 

두 쿼리의 실행결과는 다음과 같습니다.

 

위의 쿼리문은 실제 데이터 테이블에 반영되지 않았지만,

아래의 쿼리문은 COMMIT되어 실제 데이터 테이블에서 확인할 수 있습니다.

 

2) TRANSACTION의 응용

이번에는 TRANSACTION을 응용하는 방법을 알아보겠습니다.

SQL에는 BEGIN TRY ~ END TRY / BEGIN CATCH ~ END CATCH 구문을 통해 예외처리가 가능합니다.

이를 통해 TRANSACTION 처리 결과에 따라 예외처리를 진행할 수 있습니다.

-- TRANSACTION 응용
-- TRY 안에서 수행중인 트랜잭션에서 에러가 발생하면
BEGIN TRY
	BEGIN TRAN;
		INSERT INTO accounts VALUES(1, 'Kim', 100, GETUTCDATE());
		INSERT INTO accounts VALUES(2, 'Kim2', 1000, GETUTCDATE());
	COMMIT;
END TRY
-- CATCH 안의 로직을 수행함
BEGIN CATCH
	-- 현재 활성화중인 TRANSACTION이 하나라도 있다면 ROLLBACK
	IF @@TRANCOUNT > 0
		ROLLBACK
		PRINT('ROLLBACK 수행')
END CATCH

 

위의 로직에서는 TRY구문 안에서 트랜잭션을 수행하고 만일 예외가 발생했다면

CATCH 에서 활성화중인 트랜잭션이 하나라도 존재한다면, ROLLBACK하고 로그를 찍도록 합니다.

 

실행결과는 다음과 같습니다.

 

위의 쿼리를 총 2번 실행하여 위와 같은 결과를 얻을 수 있습니다.

첫 번째 실행에서 COMMIT되어 트랜잭션이 실제 데이터 테이블에 반영되었고,

두 번째 실행은 이미 존재하는 데이터 테이블을 다시 추가할 수 없어 로그가 작성되는 것을 확인하였습니다.

 

3) TRANSACTION의 유의사항

TRANSACTION의 경우 하나의 작업 단위를 의미합니다.

여기서 말하는 하나의 작업 단위는 결국 스레드와 동일합니다.

따라서 TRANSACTION 역시 스레드와 동일한 주의사항이 필요합니다.

 

스레드와 동일하게 트랜잭션 안의 로직반드시 원자성이 보장되어야 합니다.

원자성이 보장된다는 의미는 곧 해당 로직이 상호배타적으로 수행하고 종료되어야 한다는 의미입니다.

 

만약, 하나의 트랜잭션이 상호배타적으로 시작하고 종료하지 않는 경우,

다른 쿼리에서 해당 트랜잭션에서 수정하는 데이터에 접근할 때

데이터가 COMMIT되거나 ROLLBACK되기 전까지 무한히 대기하는 문제점이 발생하게 됩니다.

728x90
반응형