Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

세이브포인트와 부분 롤백

설명

세이브포인트(savepoint)는 트랜잭션이 진행되는 중에 수립되는데, 트랜잭션에 의해 수행되는 데이터베이스 갱신을 세이브포인트 지점까지만 롤백할 수 있도록 하기 위해서이다. 이 연산을 부분 롤백(partial rollback)이라고 부른다. 부분 롤백에서는 세이브포인트 이후의 데이터베이스 연산(삽입, 삭제, 갱신 등)은 하지 않은 것으로 되고 세이브포인트 지점을 포함하여 이전에 진행된 트랜잭션의 연산은 그대로 유지된다. 부분 롤백이 실행된 후에 트랜잭션은 다른 연산을 계속 진행할 수 있다. 또는 COMMIT WORK 문이나 ROLLBACK WORK 문으로 트랜잭션을 끝낼 수도 있다. 세이브포인트는 트랜잭션에서 수행된 갱신을 커밋하는 것이 아님을 명심해야 한다.

세이브포인트는 트랜잭션의 어느 시점에서도 만들 수 있고 몇 개의 세이브포인트라도 어떤 주어진 시점에 사용될 수 있다. 특정 세이브포인트보다 앞선 세이브포인트로 부분 롤백이 수행되거나 COMMIT WORK 또는 ROLLBACK WORK 문으로 트랜잭션이 끝나면 특정 세이브포인트는 제거된다. 특정 세이브포인트 이후에 대한 부분 롤백은 여러 번 수행될 수 있다.

세이브포인트는 길고 복잡한 프로그램을 통제할 수 있도록 중간 단계를 만들고 이름을 붙일 수 있기 때문에 유용하다. 예를 들어, 많은 갱신 연산 수행 시 세이브포인트를 사용하면 실수를 했을 때 모든 문장을 다시 수행할 필요가 없다.

구문

SAVEPOINT mark;

mark:

_ a SQL identifier

_ a host variable (starting with :)

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

구문

ROLLBACK [ WORK ] [ TO [ SAVEPOINT ] mark ] [ ; ]

mark:

_ a SQL identifier

_ a host variable (starting with :)

앞에서는 ROLLBACK WORK 문이 마지막 트랜잭션 이후로 입력된 모든 데이터베이스의 갱신을 제거하였다. ROLLBACK WORK 문은 특정 세이브포인트 이후로 트랜잭션의 갱신을 되돌리는 부분 롤백에도 사용된다.

mark의 값이 주어지지 않으면 트랜잭션은 모든 갱신을 취소하면서 종료한다. 여기에는 트랜잭션에 만들어진 모든 세이브포인트도 포함한다. mark가 주어지면 지정한 세이브포인트 이후의 것은 취소되고, 세이브포인트를 포함한 이전의 것은 갱신 사항이 남는다.

예제

다음 예제는 트랜잭션의 일부를 롤백하는 방법을 보여준다.

먼저 savepoint SP1, SP2를 설정한다.

CREATE TABLE athlete2 (name VARCHAR(40), gender CHAR(1), nation_code CHAR(3), event VARCHAR(30));

INSERT INTO athlete2(name, gender, nation_code, event)

VALUES ('Lim Kye-Sook', 'W', 'KOR', 'Hockey');

SAVEPOINT SP1;

 

SELECT * from athlete2;

INSERT INTO athlete2(name, gender, nation_code, event)

VALUES ('Lim Jin-Suk', 'M', 'KOR', 'Handball');

 

SELECT * FROM athlete2;

SAVEPOINT SP2;

 

RENAME TABLE athlete2 AS sportsman;

SELECT * FROM sportsman;

ROLLBACK WORK TO SP2;

위에서 athlete2 테이블의 이름 변경은 위의 부분 롤백에 의해서 롤백된다. 다음의 문장은 원래의 이름으로 질의를 수행하여 이것을 검증하고 있다.

SELECT * FROM athlete2;

DELETE FROM athlete2 WHERE name = 'Lim Jin-Suk';

SELECT * FROM athlete2;

ROLLBACK WORK TO SP2;

위에서 'Lim Jin-Suk' 을 삭제한 것은 이후에 진행되는 rollback work to SP2 명령문에 의해서 취소되었다.

다음은 SP1으로 롤백하는 경우이다.

SELECT * FROM athlete2;

ROLLBACK WORK TO SP1;

SELECT * FROM athlete2;

COMMIT WORK;