검수요청.png검수요청.png

세이브포인트

위키원
이동: 둘러보기, 검색

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

종류

  • 릴리즈 세이브포인트(RELEASE SAVEPOINT)
RELEASE [SAVEPOINT] savepoint_name 

RELEASE SAVEPOINT는 현재 트랜잭션에서 이전에 정의 된 세이브포인트(savapoint)를 삭제한다. 세이브포인트(savapoint)를 삭제하면 롤백(rollback) 지점으로 사용할 수 없지만 다른 사용자가 볼 수 있는 동작은 없다. 세이브포인트(savapoint)가 설정된 후 실행 된 명령의 효과는 취소되지 않는다. 더 이상 필요하지 않을 때 저장 점을 삭제하면 시스템이 트랜잭션 종료 이전에 일부 자원을 회수 할 수 있다. 릴리즈 세이브포인트(release savepoint) 는 명명된 세이브포인트(savapoint)가 설정된 후 설정된 모든 세이브포인트(savapoint)도 삭제한다. [4]

오류

커밋(commit) 또는 롤백(rollback)이 실행되고 트랜잭션이 시작되지 않은 경우 오류가 보고되지 않는다. 세이브포인트(savepoint)가 밸행되고 트랜잭션이 시작되지 않은 경우 오류가 보고되지 않지만 저장 점이 작성되지 않는다. 존재하지 않는 세이브포인트(savepoint)에 대해 롤백 투 세이브포인트(rollback to savepoint) 또는 릴리즈 세이브포인트(release savepoint)가 호출되면 다음과 같은 오류가 발생한다.[5]

오류 1305 (42000) : SAVEPOINT svp_name이 없습니다. 

활용

세이브포인트

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

[구문1]

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

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

[구문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)를 포함한 이전의 것은 갱신 사항이 남는다.[7]

오라클(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)을 실행했을 경우 모든 변경사항을 취소한다.[8]

각주

  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. SAVEPOINT 출시〉, 《PostgreSQL》
  5. SAVEPOINT〉, 《마리아DB)》
  6. 3) SAVEPOINT〉, 《위키독스》, 2016-01-20
  7. 7.0 7.1 세이브포인트와 부분 롤백〉, 《m.1day1》
  8. 꽁담, 〈(DATABASE) TCL 이란? COMMIT, ROLLBACK, SAVEPOINT〉, 《티스토리》, 2018-10-30

참고자료

같이 보기


  검수요청.png검수요청.png 이 세이브포인트 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.