Posts Tagged ‘트랜잭션’

[MSSQL2K] 중첩된 트랜잭션

August 29th, 2008

#1

앞서 말했듯이 오라클과는 달리 MSSQL에서는 기본적 옵션이 AUTO COMMIT이다.
그래서 BEGIN TRAN ~ ROLLBACK TRAN으로 실행하고자 하는 쿼리문을 감싸고 수행해보는게 정신건강상 안전하지만 쿼리문에 해당하는 레코드수가 천만단위가 넘어가는데 그런짓 하고 있으면 욕 대번 먹는거다.

  1. BEGIN TRAN     
  2. SELECT ‘A’     
  3. SELECT @@TRANCOUNT   
  4.       BEGIN TRAN    
  5.       SELECT ‘B’         
  6.      SELECT @@TRANCOUNT  
  7.       ROLLBACK TRAN   
  8. SELECT @@TRANCOUNT   
  9. ROLLBACK TRAN    

SELECT @@TRANCOUNT 구문은 현재 세션에서의 활성화된 트랜잭션의 갯수를 출력해준다.

위의 쿼리문에서 2번까지 실행한 후 3번을 실행한후 결과는 다음과 같다.

A
1

현재 세션에서 활성화된 트랜잭션은 1개.
5번까지 실행한 후 6번을 통해 다시 트랜잭션의 갯수를 출력하면 결과는 당연히,

2

7번 구문은 현재 활성화된 트랜잭션을 ROLLBACK하는 명령어다.
그렇다면 7번 수행후 8번의 값은?

show

#2

반면 같은 예제에서 ROLLBACK을 모두 COMMIT으로 바꿔보면

  1. BEGIN TRAN     
  2. SELECT ‘A’     
  3. SELECT @@TRANCOUNT   
  4.       BEGIN TRAN    
  5.       SELECT ‘B’         
  6.      SELECT @@TRANCOUNT  
  7.      COMMIT TRAN   
  8. SELECT @@TRANCOUNT   
  9. COMMIT TRAN

6번까지의 수행결과는 같다.
@@TRANCOUNT의 값은 2
하지만 7번을 수행한 후 위의 8번의 값은?

show

[MSSQL2K] MSSQL2K 에서의 트랜잭션 #2

July 10th, 2008

#2

앞의 #1에서의 예제 테이블을 비우자

TRUNCATE TABLE TB_TEST

그리고 이 예제를 실행시켜보자.

BEGIN TRAN

INSERT TB_TEST (K1) VALUES (1)
INSERT TB_TEST2 (K1) VALUES (2)
INSERT TB_TEST (K1) VALUES (3)

COMMIT

여기서 TB_TEST2란 테이블은 존재하지 않는다.
따라서 다음과 같은 결과 메시지를 출력한다.

(1개 행 적용됨)

서버: 메시지 208, 수준 16, 상태 1, 줄 1
개체 이름 ‘TB_TEST2′이(가) 잘못되었습니다.

아까와는 다른 결과다.
뭐, 그런가보네 하고 넘어가다가는 식겁 먹는수가 있다.

SELECT @@TRANCOUNT –현재 세션에서의 트랜잭션의 갯수를 출력하는 MSSQL 시스템 변수

해보면 값이 ‘1′ 이 떡하니 나온다.
분명 COMMIT 했는데 아직 트랜잭션이 죽지않고 살아남은거다.

이 상태에서 새창 띄워서

SELECT * FROM TB_TEST

하면 멈춘 화면을 보게 될 것이다.
LOCK 걸렸다. KILL 안해주면 정처없이 기다리게된다.
앞의 창의 프로세스명을 확인하고

KILL ‘프로세스번호’

해주면 된다.
일하다가 중간에 LOCK 걸려서 멈춘 화면 보게되면 눈물이 찔끔난다.
난 이제 어떡하나.