홈페이지 : http://www.openphp.com , http://www.openpython.com
안녕 하세요? 조성준 입니다.
PostgreSQL 8부터 생겨난 기능중 savepoint 기능에 대해 설명 하겠습니다.
- Save Point -
Save Point 라는 것은 단어에서도 느껴지듯이 Save ,Point 즉 어떤 지점을 저장또는 지정해놓는 역활을 합니다.
트랜잭션 처리중에 save point를 찍어 두었다가 rollback to 명령으로 Undo하는 기능을 가지고 있습니다.
기능의 폭이 넓지 않은 한정적이지만 유용하게 쓰일때가 생기긴합니다. 다음의 예제를 통해 이해하시기 바랍니다.
* 정상처리 *
pgbench=# create table savepoint_test ( a varchar(255),b bigint );
CREATE TABLE
pgbench=# insert into savepoint_test values('test',1);
INSERT 837035 1
pgbench=# select * from savepoint_test;
a | b
------+---
test | 1
(1 row)
pgbench=# begin work;
BEGIN
pgbench=# update savepoint_test set a = 'savepoint';
UPDATE 1
pgbench=# savepoint b_field_update;
SAVEPOINT
pgbench=# update savepoint_test set b = 2;
UPDATE 1
pgbench=# rollback to b_field_update;
ROLLBACK
pgbench=# commit;
COMMIT
pgbench=# select * from savepoint_test;
a | b
-----------+---
savepoint | 1
(1 row)
위처럼 먼저 트랜잭션 표시후 a 필드를 변경하고 , 다음 b 필드 변경전 savepoint 를 찍어 준후에
rollback을 했습니다.
만약에 이런경우를 가정한다면 어떤 정보변경이나 업무처리하고 있고 그걸 어떠한 테이블에 합계정보를 넣거나하는 작업시에
트랜잭션 동안 어떤한 검증절차를 통해 최종 컨펌을 내려야 한다면 그럴때 유용합니다. 비유가 적절할지.
다음은 불가능한 방법입니다.
* 처리 되지 않음 *
pgbench=# select * from savepoint_test;
a | b
-----------+---
savepoint | 1
(1 row)
pgbench=# begin;
BEGIN
pgbench=# savepoint a_field_test;
SAVEPOINT
pgbench=# update savepoint_test set a = 'savepoint-test2';
UPDATE 1
pgbench=# savepoint b_field_test;
SAVEPOINT
pgbench=# update savepoint_test set b = 2;
UPDATE 1
pgbench=# rollback to a_field_test;
ROLLBACK
pgbench=# commit;
COMMIT
pgbench=# select * from savepoint_test;
a | b
-----------+---
savepoint | 1
(1 row)
위와 같은 문법으로 처리는 불가능 합니다. 왠지 될듯한 문법이 지원이 않되기에 save point의 활용도가 다소 떨어지기는하지만
충분히 이용가치는 있습니다. 약간의 블럭을 지정하여 선택적인 롤백이나 Commit이 되었으면도 하는데
앞으로 두고봐야 할듯 싶습니다. |