[SQL] 이중 TRANSATION의 중요성.
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 의 신중함을 더 가져야겠다.