DataBase

[MSSQL] 트랜잭션과 @@TRANCOUNT

코북 2022. 2. 25. 10:37

 

트랜잭션

트랜잭션을 왜 사용해야 할까?

 

데이터 베이스 Update문을 사용할 때 Update문은 굉장히 위험한 명령어이므로 꼭 트랜잭션 안에서만 사용해주셔야 합니다. 특히 Update문에 실수로 Where 절을 쓰지 않고 실행을 하게 되면 테이블에 있는 컬럼이 모두 바뀌게 되는데 이런 큰 실수를 하면 되돌릴 수도 없고 바로 사직서를 써야 하는 상황이 연출될 수도 있다고 합니다.. 그러므로 먼저 Update에 하기에 앞서서 Select문으로 자신이 바꿔야할 데이터를 조회한 뒤 꼭 트랜잭션 안에서 Update를 실행해주도록 하는 것이 좋습니다.

 

 

트랜잭션이란?

 

하나의 처리를 여러 단계로 나누는 기능을 트랜잭션(Transaction)이라 합니다. 하나의 처리를 Commit이라는 명령어를 수행하기 전 마지막으로 한 번 더 확인할 수 있는 기회를 줌으로써 좀 더 안정적인 데이터베이스 작업을 가능하게 합니다. 트랜잭션의 실행 결과를 데이터베이스에 반영하는 것을 Commit이라 하고 반영하기 전으로 되돌리는 것을 RollBack이라 고 합니다.

BEGIN TRAN -- 트랜잭션 시작

ROLLBACK TRAN -- 트랜잭션 이전 상태로 ROLLBACK

COMMIT TRAN -- 트랜잭션 완료

 

 

트랜잭션 + Update

SELECT * FROM 테이블명
WHERE 컬럼명 = '내용' -- 컬럼의 존재 확인

BEGIN TRAN --트랜잭션 시작

UPDATE [테이블명] 
SET [Update할 컬럼] = '바꿀 문구' 
WHERE [컬럼명] ='기존 문구' -- 홍길동을 이순신으로 바꿈

SELECT * FROM 테이블명 
WHERE 컬럼명 = '바뀐 문구'-- 나만 바뀐것을 확인할수 있고 아직 적용은 안되어있는 상태이다.

ROLLBACK TRAN -- 되돌리기 -- Update 취소
COMMIT TRAN -- 트랜잭션 완료 -- Update 적용

 

 

예제

 

1.  My_Table에서 회사코드(COMPANY)가 '0327'이고 날짜(DT)가 2017년인 데이터를 '20190101로 수정

SELECT * FROM My_Table 
WHERE COMPANY='0327' 
AND DT LIKE '2017%' --Update할 데이터 조회

BEGIN TRAN -- 트랜잭션 시작

UPDATE My_Table 
SET DT= '20190101'  
WHERE CD_COMPANY ='0327' 
AND DT LIKE '2017%' --Update수행

SELECT * FROM My_Table 
WHERE COMPANY ='0327' 
AND DT LIKE '2019%' --바뀐 데이터 확인

COMMIT TRAN -- 트랜잭션 반영

 

2. My_Table에서 데이터에 회사코드(COMPANY) ='0327인 컬럼을 공급금액(AM)은 수량(QT)*단가(UM)로 재계산

SELECT * FROM My_Table 
WHERE COMPANY = '0327'

BEGIN TRAN

UPDATE My_Table 
SET AM = QT * UM 
WHERE COMPANY = '0327'

SELECT * FROM My_Table 
WHERE COMPANY = '0327'

COMMIT TRAN

 

3. My_Table에서 회사코드(COMPANY)='0327'인 컬럼을 날짜(DTS)는 '시스템일자' 이고 데이터에 부가세(VAT)는 공급금액(AM)의 10%로 재계산

SELECT * FROM My_Table 
WHERE COMPANY ='0327'

BEGIN TRAN

UPDATE My_Table 
SET VAT = AM * 0.1 
, DTS=NEOE.SF_SYSDATE(GETDATE()) 
WHERE CD_COMPANY ='0327'

SELECT * FROM My_Table 
WHERE COMPANY ='0327'

COMMIT TRAN

@@ TRANCOUNT

@@TRANCOUNT는 현재 연결에서 발생한 BEGIN TRANSACTION 문의 수를 반환합니다.

 

BEGIN TRANSACTION 문은 @@TRANCOUNT를 1씩 늘립니다.

ROOLBACK TRANSACTION 문은 @@TRANCOUNT를 0으로 줄입니다.

COMMIT TRANSACTION 문은 @@TRANCOUNT를 1씩 줄입니다.

 

1. BEGIN 및 COMMIT 문의 영향

PRINT @@TRANCOUNT  
--  The BEGIN TRAN statement will increment the  
--  transaction count by 1.  
BEGIN TRAN  
    PRINT @@TRANCOUNT  
    BEGIN TRAN  
        PRINT @@TRANCOUNT  
--  The COMMIT statement will decrement the transaction count by 1.  
    COMMIT  
    PRINT @@TRANCOUNT  
COMMIT  
PRINT @@TRANCOUNT  
--Results  
--0  
--1  
--2  
--1  
--0

 

 

2. BEGIN 및 ROLLBACK 문의 영향

PRINT @@TRANCOUNT  
--  The BEGIN TRAN statement will increment the  
--  transaction count by 1.  
BEGIN TRAN  
    PRINT @@TRANCOUNT  
    BEGIN TRAN  
        PRINT @@TRANCOUNT  
--  The ROLLBACK statement will clear the @@TRANCOUNT variable  
--  to 0 because all active transactions will be rolled back.  
ROLLBACK  
PRINT @@TRANCOUNT  
--Results  
--0  
--1  
--2  
--0

 

 

위의 두 예시에서 PRINT 대신 SELECT를 하여도 무관합니다.

SELCET @@TRANCOUNT

 

 

 

 

본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.

https://coding-factory.tistory.com/82

https://docs.microsoft.com/ko-kr/sql/t-sql/functions/trancount-transact-sql?view=sql-server-ver15