Notice
Recent Posts
Recent Comments
관리 메뉴

안까먹을라고 쓰는 블로그

[MSSQL] 트랜잭션(Transaction) 본문

DataBase/MS SQL

[MSSQL] 트랜잭션(Transaction)

YawnsDuzin 2023. 9. 26. 15:44

 

반응형
트랜잭션(Transaction) 이란?

트랜잭션은 작업의 한 단위입니다.
트랜잭션이 성공하면 트랜잭션 동안 이루어진 모든 데이터 수정은 커밋되고, 데이터베이스의 영구적인 부분이 됩니다.
트랜잭션에 오류가 발생하여 취소되거나 롤백되면, 모든 데이터 수정은 지워집니다.


MSSQL의 트랜잭션 모드
  • 자동 커밋 트랜잭션
    개별적으로 실행하는 쿼리가 해당됩니다.
  • 명시적 트랜잭션 (일반적으로 생각하는 트랜잭션)
    각 트랜잭션이 BEGIN TRANSACTION 문으로 명시적으로 시작하여, COMMIT 또는 ROLLBACK문으로
    명시적으로 완료 됩니다.
  • 암시적 트랜잭션
    새 트랜잭션은 이전 트랜잭션이 완료되면, 암시적으로 시작되지만, 각 트랜잭션은 COMMIT 또는 ROLLBACK문으로
    명시적으로 완됴 됩니다.
  • 일괄 처리 범위의 트랜잭션
    MARS(Multiple Active Result Sets)에만 해당되며, MARS 세션에서 시작되는 Transact-SQL 명시적 또는
    암시적 트랜잭션이 일괄 처리 범위 트랜잭션이 됩니다. 일괄처리가 완료될 때 커밋되거나 롤백되지 않은
    일괄 처리 범위의 트랜잭션은 SQL Server 에서 자동으로 롤백합니다.

 

MSSQL은 다음과 같은 트랜잭션 문을 제공합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 결과 값 조회(Transaction 전)
SELECT '결과 값 조회(Transaction 전)'* FROM [NEOE].[ORDERWHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
 
-- Transaction 시작
BEGIN TRAN
    -- 업데이트문 실행(Transaction 안)
    UPDATE [NEOE].[ORDERSET QT_ORDER = 222 WHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
    -- 결과 값 조회(Transaction 안)
    SELECT '결과 값 조회(Transaction 안)'* FROM [NEOE].[ORDERWHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
-- Transaction COMMIT
COMMIT TRAN
 
-- 결과 값 조회(COMMIT 후)
SELECT '결과 값 조회(COMMIT 후)'* FROM [NEOE].[ORDERWHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
cs

※ 좀더 자세한 설명을 원하시면, 하단의 MS공식사이트를 참고하시기 바랍니다.
https://learn.microsoft.com/ko-kr/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16


TRANSACTION 쿼리 예
1. MSSQL - 기본적인 TRANSACTION 쿼리 (COMMIT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 결과 값 조회(Transaction 전)
SELECT '결과 값 조회(Transaction 전)'* FROM [NEOE].[ORDERWHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
 
-- Transaction 시작
BEGIN TRAN
    -- 업데이트문 실행(Transaction 안)
    UPDATE [NEOE].[ORDERSET QT_ORDER = 222 WHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
    -- 결과 값 조회(Transaction 안)
    SELECT '결과 값 조회(Transaction 안)'* FROM [NEOE].[ORDERWHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
-- Transaction ROLLBACK
ROLLBACK TRAN
 
-- 결과 값 조회(ROLLBACK 후)
SELECT '결과 값 조회(ROLLBACK 후)'* FROM [NEOE].[ORDERWHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
cs

 

2. MSSQL - 기본적인 TRANSACTION 쿼리 (ROLLBACK)
-- 결과 값 조회(Transaction 전)
SELECT '결과 값 조회(Transaction 전)', * FROM [NEOE].[ORDER] WHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'

-- Transaction 시작
BEGIN TRAN
	-- 업데이트문 실행(Transaction 안)
	UPDATE [NEOE].[ORDER] SET QT_ORDER = 222 WHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
	-- 결과 값 조회(Transaction 안)
	SELECT '결과 값 조회(Transaction 안)', * FROM [NEOE].[ORDER] WHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'
-- Transaction ROLLBACK
ROLLBACK TRAN

-- 결과 값 조회(ROLLBACK 후)
SELECT '결과 값 조회(ROLLBACK 후)', * FROM [NEOE].[ORDER] WHERE DT_ORDER = '20230903' AND CD_ITEM = 'item3'

 

예외처리

"GOTO ERROR" 를 호출하면 하단의 "ERROR:" 로 이동하여, "ROLLBACK TRAN"을 실행하며,
일반적인 경우, "COMMIT TRAN" 실행 후, "RETURN"으로 "ERROR:" 전에 빠져 나간다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- Transaction 시작
BEGIN TRAN
    
    -- Transaction 안에서 처리작업 진행
 
    -- 뭔가 예외사항이나 문제 발생 시,,
    IF @@ERROR <> 0
        GOTO ERROR 
 
COMMIT TRAN
RETURN
 
 
ERROR:            
    ROLLBACK  TRAN
 
    SET @V_ERRMSG = '오류메시지.'
    RAISERROR (@V_ERRMSG, 18,1)
cs




반응형
Comments