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 의 신중함을 더 가져야겠다.
'개발 > MSSQL' 카테고리의 다른 글
[SQL] PIVOT에 대해 알아보고, 꿀팁도 얻어가자. (2) | 2020.06.25 |
---|---|
[SQL] 데이터 정렬(COLLATE) 변경 방법에 대해 알아보자. (2) | 2020.04.29 |
[SQL] 컬럼(Column)의 내용을 조인(Join)해보자. (3) | 2020.03.24 |
[SQL] 엑셀(EXCEL) 데이터 DBMS에 가져오기. (7) | 2020.03.09 |
[SQL] SELECT(조회)할 때, 컬럼 NVARCHAR(MAX)를 조심하자. (2) | 2020.03.06 |