SAVEPOINT

SQL 전문가 가이드 2013. 9. 24. 16:04

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제4절 TCL (TRANSACTION CONTROL LANGUAGE)

4. SAVEPOINT

 

 

[준비] 별도 제공한 SQL SCRIPT를 통해 PLAYER 테이블의 데이터를 새롭게 생성 (SQL 전문가 가이드 실습용 파일.zip)

이번 예제를 수행하기 전에 [3. ROLLBACK] 예제를 하면서 PLAYER 테이블의 데이터를 지웠기 때문에 데이터를 다시 입력해줍니다.

 

 

[예제] SAVEPOINT를 지정하고, PLAYER 테이블에 데이터를 입력한 다음 롤백(ROLLBACK)을 이전에 설정한 저장점까지 실행한다.

 BEGIN TRAN;

 -- 명령이 완료되었습니다.

 SAVE TRAN SVTR1;

 -- 명령이 완료되었습니다.
 INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
 VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);

 -- (1개 행이 영향을 받음)
 ROLLBACK TRAN SVTR1;

 -- 명령이 완료되었습니다.
 COMMIT;

 -- 명령이 완료되었습니다.

책에 나온 대로 하면 [활성 트랜잭션이 없을 때는 SAVE TRANSACTION을 실행할 수 없습니다.] 라는 오류 메세지가 발생합니다.

저장점(SAVEPOINT)을 생성하기전에 트랜잭션을 활성화 시켜줘야 하기때문에 BEGIN TRAN 을 실행해줍니다.

*  가장 오래 전에 활성화된 트랜잭션 정보 확인 명령어

    DBCC OPEN TRAN

 

 


 

 

[예제] 먼저 SAVEPOINT를 지정하고 PLAYER 테이블에 있는 데이터를 수정한 다음 롤백(ROLLBACK)을 이전에 설정한 저장점까지 실행한다. 

 BEGIN TRAN;

 -- 명령이 완료되었습니다.
 SAVE TRAN SVTR2;

 -- 명령이 완료되었습니다.
 UPDATE PLAYER SET WEIGHT = 100;

 -- (480개 행이 영향을 받음)
 ROLLBACK TRAN SVTR2;

 -- 명령이 완료되었습니다.
 COMMIT;

 -- 명령이 완료되었습니다.

 

 


 

 

[예제] SAVEPOINT를 지정하고, PLAYER 테이블에 있는 데이터를 삭제한 다음 롤백(ROLLBACK)을 이전에 설정한 저장점까지 실행한다. 

 BEGIN TRAN;

 -- 명령이 완료되었습니다.
 SAVE TRAN SVTR3;
 -- 명령이 완료되었습니다.
 DELETE FROM PLAYER;
 -- (480개 행이 영향을 받음)

 ROLLBACK TRAN SVTR3;
 -- 명령이 완료되었습니다.
 COMMIT;

 -- 명령이 완료되었습니다.

 

 


 

 

 

[예제] 새로운 트랜잭션을 시작하기 전에 PLAYER 테이블의 데이터 건수와 몸무게가 100인 선수의 데이터 건수를 확인한다.

※ 몸무게를 확인할 수 있는 WHERE 절 조건과 데이터 건수를 집계하기 위한 COUNT 함수는 1장 5절과 6절에서 설명한다.

 SELECT COUNT(*)

 FROM PLAYER;

 

 -- (1개 행이 영향을 받음)

 SELECT COUNT(*)

 FROM PLAYER

 WHERE WEIGHT = 100;

  

 -- (1개 행이 영향을 받음)

 

 


 

 

[예제] [그림 Ⅱ-1-11]을 확인하기 위해 새로운 트랜잭션을 시작하고 SAVEPOINT A와 SAVEPOINT B를 지정한다.

 BEGIN TRAN;

 -- 명령이 완료되었습니다.
 INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
 VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);

 -- (1개 행이 영향을 받음)
 SAVE TRAN SVTR_A;

 -- 명령이 완료되었습니다.
 UPDATE PLAYER SET WEIGHT = 100;

 -- (481개 행이 영향을 받음)
 SAVE TRAN SVTR_B;

 -- 명령이 완료되었습니다.
 DELETE FROM PLAYER;

 -- (481개 행이 영향을 받음)

책에는 Oracle 결과만 있어서 SQL Server 에 맞게 수정하였습니다.

BEGIN TRAN 으로 새로운 트랜잭션을 시작하고 지금까지는 COMMIT 으로 트랜잭션을 완료시켰었는데,

이번 예제에서 트랜잭션을 완료시키면 당연히 [예제] CASE 1,2,3 을 진행 할 수가 없습니다.

(이유는 책에 자세히 나와있습니다.)

[예제] CASE 3 에서 ROLLBACK 으로 트랜잭션을 완료합니다.

 

 

[예제] CASE1. SAVEPOINT B 저장점까지 롤백(ROLLBACK)을 수행하고 롤백 전후 데이터를 확인해본다. 

 SELECT COUNT(*)

 FROM PLAYER; 

 

 -- (1개 행이 영향을 받음)

 ROLLBACK TRAN SVTR_B;

 SELECT COUNT(*)

 FROM PLAYER; 

 

 -- (1개 행이 영향을 받음)

 

 

[예제] CASE2. SAVEPOINT A 저장점까지 롤백(ROLLBACK)을 수행하고 롤백 전후 데이터를 확인해본다. 

 SELECT COUNT(*)

 FROM PLAYER

 WHERE WEIGHT = 100; 

 

 -- (1개 행이 영향을 받음)

 ROLLBACK TRAN SVTR_A;

 SELECT COUNT(*)

 FROM PLAYER

 WHERE WEIGHT = 100; 

 

 -- (1개 행이 영향을 받음)

 

 

[예제] CASE3. 트랜잭션 최초 시점까지 롤백(ROLLBACK)을 수행하고 롤백 전후 데이터를 확인해본다. 

 SELECT COUNT(*)

 FROM PLAYER; 

 

 -- (1개 행이 영향을 받음)

 ROLLBACK;
 SELECT COUNT(*)

 FROM PLAYER; 

 

 -- (1개 행이 영향을 받음)

 

'SQL 전문가 가이드' 카테고리의 다른 글

SQL 연산자  (0) 2013.09.26
비교 연산자  (0) 2013.09.24
ROLLBACK  (0) 2013.09.23
COMMIT  (0) 2013.09.23
산술 연산자와 합성 연산자  (2) 2013.09.23
Posted by G4.
,