안규 공부방

MS-SQL > Transaction & Lock - 중첩 트랜잭션(Nested Transactions)

등록일 : 2017-07-03 19:41 조회수 : 93,563

Nested Transaction은 트랜잭션 내에서 다시 트랜잭션을 정의하는 방법입니다.
그리구, savepoint 라는걸 알아볼텐데요. 이것은 전체 트랜잭션이 아니라 특정 시점까지의 트랜잭션만
취소되도록 하는 방법입니다.

  9.3.1  트랜잭션 내의 트랜잭션 처리(Nested Transactions)
 
  트랜잭션 내에서 다시 트랜잭션을 정의할수 있습니다.
  그러나, 가장 먼저 시작한 트랜잭션만이 실질적인 의미를 가지며, 그속에 내장된 트랜잭션은 단순히
  @@trancount값만을 증가시킵니다. 왜냐하면 어차피 트랜잭션이라는것은 그 정의 자체가 All or Nothing
  개념으로 처리가 모두 되거나 아니면 모두 취소가 되기 때문이지요.
 
  현재 트랜잭션 네스팅 상태를 보려면 @@trancount 값이나 DBCC OPENTRAN 명령을 사용하면 됩니다.
 
 
Nested Transaction 예제
		SET IMPLICIT_TRANSACTIONS OFF
		
		go
		SELECT @@TRANCOUNT              		-- 값은 0
		BEGIN TRAN TRAN_1       	       		-- 처음 트랜잭션 TRAN_1
			SELECT @@TRANCOUNT			-- 값은 1
			BEGIN TRAN TRAN_2			-- 두번째 트랜잭션 TRAN_2
				SELECT @@TRANCOUNT		-- 값은 2
				CREATE TABLE TEST_TBL(ID INT)
				
				DBCC OPENTRAN	
				
				BEGIN TRAN TRAN_3		-- 세번째 트랜잭션 TRAN_3	
					SELECT @@TRANCOUNT	-- 값은 3
				COMMIT TRAN TRAN_3		-- 세번째 트랜잭션 완료
			COMMIT TRAN TRAN_2			-- 두번째 트랜잭션 완료	
		COMMIT TRAN TRAN_1				-- 첫번째 트랜잭션 완료	
		SELECT @@TRANCOUNT				-- 값은 0
		
		
  
     
      어찌보면 굉장히 복잡하게 보이지만, 어렵지 않는 내용입니다.
      트랜잭션을 종료하기 위해서는 BETRAN 문을 사용한 만큼 그에 대응되는 COMMIT문을 사용하거나 BEGIN TRAN
      문을 수에 상관없이 ROLLBACK문을 한번만 사용해 주면 됩니다.
     
      위의 예제처럼 BEGIN TRAN 문을 세번 사용했다면 COMMIT 문을 세번사용해야만 완전히 트랜잭션이 완료되는
      것을 알수 있습니다.
     
9.3.2  트랜잭션 SAVEPOINT 시점 까지만 ROLLBACK

SAVEPOINT 라는것은 트랜잭션 처리중의 한 과정을 가리키는 주소 개념입니다.
이것은 트랜잭션을 처리하다가 업무 규칙상의 오류가 발생했을 때 그냥 ROLLBACK TRAN 문을 사용하여 전체
트랜잭션이 취소되는 것을 막을 수 있는 방법으로 ROLLBACK TRAN SAVEPOINT_NAME 형식을 사용하여 진행된
트랜잭션 중에서 특정 시점까지만 취소할수 있게끔 해 줍니다.

예제를 보면서 해야겠지요? 아래의 예제를 보면,

 
SAVEPOINT 예제
		CREATE TABLE tran4 (id int, trancnt int)
		
		BEGIN TRAN
			INSERT TRAN4 VALUES(1,@@trancount)
			SAVE TRANSACTION tran_step1 	    -- 트랜잭션 SAVEPOINT 정의
				INSERT tran4 VALUES(2,@@TRANCOUNT)
			ROLLBACK TRAN tran_step1		    -- SAVEPOINT 시점까지만 취소
			INSERT tran4 VALUES(3,@@trancount)
		COMMIT TRAN
		
		SELECT * FROM tran4		
		
		
 
     
      위의 예제의 결과를 보면
     
      id      trancnt
      ------------------
      1         2
      3         2
     
      와 같이 2번에 대한 데이타는 rollback 처리가 되었음을 알수 있습니다.
     
      언제 이런걸 사용하게 될지는 모르겠지만, 이런 명령도 있구나 하는 정도는 알아두는것이 좋을 듯 싶어서
      몇자 적어 보았습니다.
     
      오늘도 행복하시와여.
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.