반응형

Insert / Update / Delete 와 같이, Transation (이하 트랜잭션)이 발생 할 경우

BEGIN TRAN 으로 시작하여. COMMIT TRAN 혹은 ROLLBACK TRAN으로 마무리한다.

 

이때, BEGIN TRAN 안에 또 다른 BEGIN TRAN 이 존재하고

그 안에 또 다른 BEGIN TRAN이 존재한다고 하면 상당히 머리가 아프다.

뭐 기본적인 IF문 안에 IF문이 있고, 그 IF문 안에 IF문이 있다고 하면 이해하기 어려운 것 처럼 말이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 1. 트랜잭션 시작.
BEGIN TRAN
 
    -- 2. INSERT / UPDATE / DELETE 실행.
    UPDATE __TMP
    SET [Name] = '123'
    WHERE ID = 1;
 
    -- 3. 새로운 트랜잭션 시작.
    BEGIN TRAN
 
        UPDATE __TMP
        SET [Name] = '456'
        WHERE ID = 2;
 
    COMMIT TRAN
 
ROLLBACK TRAN
cs

1. BEGIN TRAN을 걸고.

2. UPDATE를 실행.

3. 또다른 BEGIN TRAN을 시작.

4. UPDATE 실행.

5. COMMIT TRAN.

6. ROLLBACK TRAN.

 

이렇게 실행되면 2/4번에서 실행하였던, __TMP 테이블 업데이트는 모두 ROLLBACK이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 1. 트랜잭션 시작.
BEGIN TRAN
 
    -- 2. INSERT / UPDATE / DELETE 실행.
    UPDATE __TMP
    SET [Name] = '123'
    WHERE ID = 1;
 
    -- 3. 새로운 트랜잭션 시작.
    BEGIN TRAN
 
        UPDATE __TMP
        SET [Name] = '456'
        WHERE ID = 2;
 
    ROLLBACK TRAN
 
COMMIT TRAN
cs

또다른 예시를 보면.

5번에서 COMMIT TRAN => ROLLBACK TRAN으로만 변경된다.

그러면 이전과 동일하게 2/4번에서 실행한, __TMP 테이블 업데이트는 모두 ROLLBACK이 된다.

그리고 난 다음, 마지막 COMMIT TRAN을 수행할때 위에와 같은 오류가 발생한다.

당연하게도 18번째 라인이, COMMIT TRAN => ROLLBACK TRAN으로 변경되면

위에와 같은 오류가 발생한다.

이 부분이 가장 핵심인거 같다.

 

ROLLBACK TRAN이 실행되면, 이전에 열려있던 BEGIN TRAN을 모두 ROLLBACK 시킨다.

참고하고 명심하자.

이중 트랜잭션의 COMMIT / ROLLBACK 의 신중함을 더 가져야겠다.

반응형

+ Recent posts