의견.png

"세이브포인트"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
2번째 줄: 2번째 줄:
  
 
== 특징 ==
 
== 특징 ==
저장된 세이브포인트(savepoint)는 ROLLBACK TO SAVEPOINT문을 사용하여 표시한 곳까지 롤백(rollback)할 수 있다. 여러 개의 SQL문 실행을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 세이브포인트(savepoint)를 지정할 수 있다. 이 세이브포인트(savepoint)는 차후 롤백(rollback)과 함께 사용하여 현재 트랜잭션 내의 특정 세이브포인트(savepoint)까지 롤백(rollback)할 수 있게 된다.<ref>냉유, 〈[https://keep-cool.tistory.com/46 (SQL 19) 트랜잭션 & TCL(COMMIT, ROLLBACK, SAVEPOINT)]〉, 《티스토리》, 2017-12-10</ref>
+
저장된 세이브포인트(savepoint)는 ROLLBACK TO SAVEPOINT 문을 사용하여 표시한 곳까지 롤백(rollback) 할 수 있다. 여러 개의 SQL 문 실행을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 세이브포인트(savepoint)를 지정할 수 있다. 이 세이브포인트(savepoint)는 차후 롤백(rollback)과 함께 사용하여 현재 트랜잭션 내의 특정 세이브포인트(savepoint)까지 롤백(rollback) 할 수 있게 된다.<ref>냉유, 〈[https://keep-cool.tistory.com/46 (SQL 19) 트랜잭션 & TCL(COMMIT, ROLLBACK, SAVEPOINT)]〉, 《티스토리》, 2017-12-10</ref>
 
또한, 논리적인 명령어이지만 트랜잭션이 진행되는 동안 어떤 위치에 어떤 이름을 몇 개의 세이브포인트(savepoint)를 구현했는지 확인할 수 없으며 확인 가능한 명령어가 존재하지 않기 때문에 당사자가 기억을 해야만 쓸 수 있다.<ref>김뽀삐., 〈[https://ckim0531.tistory.com/entry/SQL-%ED%99%9C%EC%9A%A9-7-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%A1%B0%EC%9E%91%EC%96%B4-DML-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%A0%9C%EC%96%B4-%EB%AA%85%EB%A0%B9%EC%96%B4-COMMIT-ROLLBACK-SAVEPOINT (SQL 활용)7. 데이터조작어(DML)-트랜잭션 제어 명령어(COMMIT, ROLLBACK, SAVEPOINT)]〉, 《티스토리》, 2018-07-27</ref>
 
또한, 논리적인 명령어이지만 트랜잭션이 진행되는 동안 어떤 위치에 어떤 이름을 몇 개의 세이브포인트(savepoint)를 구현했는지 확인할 수 없으며 확인 가능한 명령어가 존재하지 않기 때문에 당사자가 기억을 해야만 쓸 수 있다.<ref>김뽀삐., 〈[https://ckim0531.tistory.com/entry/SQL-%ED%99%9C%EC%9A%A9-7-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%A1%B0%EC%9E%91%EC%96%B4-DML-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%A0%9C%EC%96%B4-%EB%AA%85%EB%A0%B9%EC%96%B4-COMMIT-ROLLBACK-SAVEPOINT (SQL 활용)7. 데이터조작어(DML)-트랜잭션 제어 명령어(COMMIT, ROLLBACK, SAVEPOINT)]〉, 《티스토리》, 2018-07-27</ref>
 +
중복된 세이브포인트(savepoint) 이름을 트랜잭션에서 사용할 수 있지만 세이브포인트(savepoint) 이름을 지정하는 ROLLBACK TRANSACTION 문은 해당 이름을 사용하는 최신 SAVE TRANSACTION 으로만 트랜잭션을 롤백(rollback)한다. BEGIN DISTRIBUTED TRANSACTION으로 명시적으로 시작되거나 로컬 트랜잭션에서 에스컬레이션된 분산 트랜잭션에서는 SAVE TRANSACTION이 지원되지 않는다. savepoint_name을 지정하는 ROLLBACK TRANSACTION 문은 에스컬레이션과 변환을 제외하고 세이브포인트(savepoint)을 초과하여 획득한 모든 잠금을 해제한다. 이러한 잠금은 해제되지 않으며 이전 잠금 모드로 다시 변환되지 않는다.<ref>〈[https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-ver15 SAVE TRANSACTION(Transact-SQL)]〉, 《마이크로소프트》, 2016-06-10</ref>
  
 
== 활용 ==
 
== 활용 ==
 
[[파일:세이브포인트.png|500픽셀|섬네일|세이브포인트]]
 
[[파일:세이브포인트.png|500픽셀|섬네일|세이브포인트]]
롤백(rollback)을 실행하면 트랜잭션 시작 전인 원래의 상태로 되돌아 간다. 그러나 트랜잭션 내에 세이브포인트(savepoint)를 이용하여 저장점을 만들어 놓으면 ROLLBACK TO savepoint_name 명령으로 세이브포인트(savepoint)를 지정해 놓은 지점으로 되돌아 갈 수 있다. 여기서 주의할 것은 롤백(rollback)으로 돌아간다고 해서 저장이 된다고 착각하면 안된다. 저장은 오직 커밋(commit) 명령을 실행해야만 실제 디스크에 저장된다.
+
롤백(rollback)을 실행하면 트랜잭션 시작 전인 원래의 상태로 되돌아간다. 그러나 트랜잭션 내에 세이브포인트(savepoint)를 이용하여 저장점을 만들어 놓으면 ROLLBACK TO savepoint_name 명령으로 세이브포인트(savepoint)를 지정해 놓은 지점으로 되돌아갈 수 있다. 여기서 주의할 것은 롤백(rollback)으로 돌아간다고 해서 저장이 된다고 착각하면 안 된다. 저장은 오직 커밋(commit) 명령을 실행해야만 실제 디스크에 저장된다.
 
<ref>〈[https://wikidocs.net/4098 3) SAVEPOINT]〉, 《위키독스》, 2016-01-20</ref>
 
<ref>〈[https://wikidocs.net/4098 3) SAVEPOINT]〉, 《위키독스》, 2016-01-20</ref>
  
15번째 줄: 16번째 줄:
 
  _ a SQL identifier
 
  _ a SQL identifier
 
  _ a host variable (starting with :)  
 
  _ a host variable (starting with :)  
같은 트랜잭션 내에 여러 개의 세이브포인트(savepoint)를 지정할 때 mark를 같은 값으로 하면 마지막 세이브포인트(savepoint)만 부분 롤백(rollback)에 나타난다. 또한, 이전의 세이브포인트(savepoint)는 제일 마지막 세이브포인트(savepoint)로 부분 롤백(rollback)할 때까지 감춰졌다가 마지막 세이브포인트(savepoint)가 사용된 후 없어지면 나타난다. <ref name="세이브포인트 활용">〈[http://m.1day1.org/cubrid/manual/syntax/syntax_tran_tran_savepoint.htm 세이브포인트와 부분 롤백]〉, 《m.1day1》</ref>
+
같은 트랜잭션 내에 여러 개의 세이브포인트(savepoint)를 지정할 때 mark를 같은 값으로 하면 마지막 세이브포인트(savepoint)만 부분 롤백(rollback)에 나타난다. 또한, 이전의 세이브포인트(savepoint)는 제일 마지막 세이브포인트(savepoint)로 부분 롤백(rollback) 할 때까지 감춰졌다가 마지막 세이브포인트(savepoint)가 사용된 후 없어지면 나타난다. <ref name="세이브포인트 활용">〈[http://m.1day1.org/cubrid/manual/syntax/syntax_tran_tran_savepoint.htm 세이브포인트와 부분 롤백]〉, 《m.1day1》</ref>
  
 
[구문2]
 
[구문2]
38번째 줄: 39번째 줄:
 
  SAVEPOINT TRANSACTION 포인트명2;
 
  SAVEPOINT TRANSACTION 포인트명2;
 
  ROLLBACK TRANSACTION 포인트명1;  
 
  ROLLBACK TRANSACTION 포인트명1;  
 +
특정 저장점까지 롤백(rollback) 하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문에 위에서의 경우 포인트명 1로 롤백(rollback) 한 경우 포인트명2로 되돌릴 수 없다. 저장점 지정 없이 롤백(rollback)을 실행했을 경우 모든 변경사항을 취소한다.<ref>꽁담, 〈[https://mozi.tistory.com/209 [DATABASE] TCL 이란? COMMIT, ROLLBACK, SAVEPOINT]〉, 《티스토리》, 2018-10-30</ref>
  
 
{{각주}}
 
{{각주}}
45번째 줄: 47번째 줄:
 
* 김뽀삐., 〈[https://ckim0531.tistory.com/entry/SQL-%ED%99%9C%EC%9A%A9-7-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%A1%B0%EC%9E%91%EC%96%B4-DML-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%A0%9C%EC%96%B4-%EB%AA%85%EB%A0%B9%EC%96%B4-COMMIT-ROLLBACK-SAVEPOINT (SQL 활용)7. 데이터조작어(DML)-트랜잭션 제어 명령어(COMMIT, ROLLBACK, SAVEPOINT)]〉, 《티스토리》, 2018-07-27
 
* 김뽀삐., 〈[https://ckim0531.tistory.com/entry/SQL-%ED%99%9C%EC%9A%A9-7-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%A1%B0%EC%9E%91%EC%96%B4-DML-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%A0%9C%EC%96%B4-%EB%AA%85%EB%A0%B9%EC%96%B4-COMMIT-ROLLBACK-SAVEPOINT (SQL 활용)7. 데이터조작어(DML)-트랜잭션 제어 명령어(COMMIT, ROLLBACK, SAVEPOINT)]〉, 《티스토리》, 2018-07-27
 
* 〈[https://wikidocs.net/4098 3) SAVEPOINT]〉, 《위키독스》, 2016-01-20
 
* 〈[https://wikidocs.net/4098 3) SAVEPOINT]〉, 《위키독스》, 2016-01-20
 +
* 마이크로소프트 SAVE TRANSACTION(Transact-SQL) - https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-ver15
 +
* 꽁담, 〈[https://mozi.tistory.com/209 [DATABASE] TCL 이란? COMMIT, ROLLBACK, SAVEPOINT]〉, 《티스토리》, 2018-10-30
 
* 〈[http://m.1day1.org/cubrid/manual/syntax/syntax_tran_tran_savepoint.htm 세이브포인트와 부분 롤백]〉, 《m.1day1》
 
* 〈[http://m.1day1.org/cubrid/manual/syntax/syntax_tran_tran_savepoint.htm 세이브포인트와 부분 롤백]〉, 《m.1day1》
  

2020년 9월 7일 (월) 14:34 판

세이브포인트(save point)는 특정한 지점까지 진행된 작업을 저장하고 그 이후 지점에 해당하는 작업은 취소하는 것을 말한다. 세이브포인트는 '임시저장' 또는 '부분저장'과 같은 맥락으로 이해할 수 있다. 보통 롤백(rollback)을 하면 삽입, 삭제, 업데이트 등의 작업 전체가 취소되는데, 세이브포인트는 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용한다. 세이브포인트를 쓰면 현재의 트랜잭션을 작게 분할하는 것이 가능하다. 세이브포인트는 여러 개의 에스큐엘(SQL)문의 실행을 수행하는 트랜잭션의 경우에 사용자가 트랜잭션 중간 단계에서 세이브포인트를 지정할 수 있다. 세이브포인트를 쓰려면 취소하려는 지점을 명시한 뒤, 그 지점까지 작업을 취소하는 식으로 사용하는데 이 지점을 세이브포인트라고 한다. 세이브포인트를 지정한 뒤, "롤백 투 세이브포인트 이름;"(rollback to save point name;)을 실행하면 해당 세이브포인트 지점까지 처리한 직업이 롤백된다.

특징

저장된 세이브포인트(savepoint)는 ROLLBACK TO SAVEPOINT 문을 사용하여 표시한 곳까지 롤백(rollback) 할 수 있다. 여러 개의 SQL 문 실행을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 세이브포인트(savepoint)를 지정할 수 있다. 이 세이브포인트(savepoint)는 차후 롤백(rollback)과 함께 사용하여 현재 트랜잭션 내의 특정 세이브포인트(savepoint)까지 롤백(rollback) 할 수 있게 된다.[1] 또한, 논리적인 명령어이지만 트랜잭션이 진행되는 동안 어떤 위치에 어떤 이름을 몇 개의 세이브포인트(savepoint)를 구현했는지 확인할 수 없으며 확인 가능한 명령어가 존재하지 않기 때문에 당사자가 기억을 해야만 쓸 수 있다.[2] 중복된 세이브포인트(savepoint) 이름을 트랜잭션에서 사용할 수 있지만 세이브포인트(savepoint) 이름을 지정하는 ROLLBACK TRANSACTION 문은 해당 이름을 사용하는 최신 SAVE TRANSACTION 으로만 트랜잭션을 롤백(rollback)한다. BEGIN DISTRIBUTED TRANSACTION으로 명시적으로 시작되거나 로컬 트랜잭션에서 에스컬레이션된 분산 트랜잭션에서는 SAVE TRANSACTION이 지원되지 않는다. savepoint_name을 지정하는 ROLLBACK TRANSACTION 문은 에스컬레이션과 변환을 제외하고 세이브포인트(savepoint)을 초과하여 획득한 모든 잠금을 해제한다. 이러한 잠금은 해제되지 않으며 이전 잠금 모드로 다시 변환되지 않는다.[3]

활용

세이브포인트

롤백(rollback)을 실행하면 트랜잭션 시작 전인 원래의 상태로 되돌아간다. 그러나 트랜잭션 내에 세이브포인트(savepoint)를 이용하여 저장점을 만들어 놓으면 ROLLBACK TO savepoint_name 명령으로 세이브포인트(savepoint)를 지정해 놓은 지점으로 되돌아갈 수 있다. 여기서 주의할 것은 롤백(rollback)으로 돌아간다고 해서 저장이 된다고 착각하면 안 된다. 저장은 오직 커밋(commit) 명령을 실행해야만 실제 디스크에 저장된다. [4]

[구문1]

SAVEPOINT mark;
mark:
_ a SQL identifier
_ a host variable (starting with :) 

같은 트랜잭션 내에 여러 개의 세이브포인트(savepoint)를 지정할 때 mark를 같은 값으로 하면 마지막 세이브포인트(savepoint)만 부분 롤백(rollback)에 나타난다. 또한, 이전의 세이브포인트(savepoint)는 제일 마지막 세이브포인트(savepoint)로 부분 롤백(rollback) 할 때까지 감춰졌다가 마지막 세이브포인트(savepoint)가 사용된 후 없어지면 나타난다. [5]

[구문2]

ROLLBACK [ WORK ] [ TO [ SAVEPOINT ] mark ] [ ; ]
mark:
_ a SQL identifier
_ a host variable (starting with :) 

앞에서는 ROLLBACK WORK 문이 마지막 트랜잭션 이후로 입력된 모든 데이터베이스의 갱신을 제거하였다. ROLLBACK WORK 문은 특정 세이브포인트(savepoint) 이후로 트랜잭션의 갱신을 되돌리는 부분 롤백(rollback)에도 사용된다. mark의 값이 주어지지 않으면 트랜잭션은 모든 갱신을 취소하면서 종료한다. 여기에는 트랜잭션에 만들어진 모든 세이브포인트(savepoint)도 포함한다. mark가 주어지면 지정한 세이브포인트(savepoint) 이후의 것은 취소되고, 세이브포인트(savepoint)를 포함한 이전의 것은 갱신 사항이 남는다.[5]

오라클(Oracle)

SAVEPOINT 포인트명1;
SAVEPOINT 포인트명2;
ROLLBACK TO 포인트명1; 

골디락스(GOLDILOCKS)

SAVEPOINT 포인트명1;
SAVEPOINT 포인트명2;
ROLLBACK TO SAVEPOINT 포인트명1; 

MS-SQL

SAVEPOINT TRANSACTION 포인트명1;
SAVEPOINT TRANSACTION 포인트명2;
ROLLBACK TRANSACTION 포인트명1; 

특정 저장점까지 롤백(rollback) 하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문에 위에서의 경우 포인트명 1로 롤백(rollback) 한 경우 포인트명2로 되돌릴 수 없다. 저장점 지정 없이 롤백(rollback)을 실행했을 경우 모든 변경사항을 취소한다.[6]

각주

  1. 냉유, 〈(SQL 19) 트랜잭션 & TCL(COMMIT, ROLLBACK, SAVEPOINT)〉, 《티스토리》, 2017-12-10
  2. 김뽀삐., 〈(SQL 활용)7. 데이터조작어(DML)-트랜잭션 제어 명령어(COMMIT, ROLLBACK, SAVEPOINT)〉, 《티스토리》, 2018-07-27
  3. SAVE TRANSACTION(Transact-SQL)〉, 《마이크로소프트》, 2016-06-10
  4. 3) SAVEPOINT〉, 《위키독스》, 2016-01-20
  5. 5.0 5.1 세이브포인트와 부분 롤백〉, 《m.1day1》
  6. 꽁담, 〈[DATABASE TCL 이란? COMMIT, ROLLBACK, SAVEPOINT]〉, 《티스토리》, 2018-10-30

참고자료

같이 보기


  의견.png 이 세이브포인트 문서는 프로그래밍에 관한 토막글입니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 이 문서의 내용을 채워주세요.