PostgreSQL에서는 BEGIN과 END로 Transaction의 시작과 끝을 표시를 합니다.
하나의 트랜젝션으로 관리를 할 쿼리부분을 begin; 과 end;로 묶으시고 쿼리중 문제가 생길경우 rollback;을 해주시면 됩니다.
다음은 제가 psql을 이용하여 테스트한 화면입니다. (test라는 테이블은 integer 칼럼 하나만을 가지고 있는 것입니다.)
=> select * from test;
id
----
(0 rows)
=> begin;
BEGIN
=> insert into test values (10);
INSERT 19784 1
=> insert into test values (20);
INSERT 19785 1
=> select * from test;
id
----
10
20
(2 rows)
=> rollback;
ROLLBACK
=> end;
NOTICE: COMMIT: no transaction in progress
COMMIT
=> select * from test;
id
----
(0 rows)
위에서 보시는 바와 같이 잘 되죠? 자세한 것은 레퍼런스 메뉴얼을 참조해 주십시요.
그리고 PL/pgSQL에서는 (메뉴얼에 보면) 함수 내에서 에러가 발생할 경우 그 트랜젝션은 자동으로 Rollback되는 것으로 나와있습니다.
이의 예제는 다음 글에 소개할 것입니다.
김일형.
>>이성한 님께서 쓰시길<<
:: 안녕 하십니까 이성한 입니다.
::
::
:: transaction 관리에 대한 질문입니다.
::
:: 다음과 같은 sql 문장을 psql에서 실행을 했습니다.
::
:: tms=>INSERT INTO tmsrout010 VALUES ( 55, 55, 55, 55) ;
:: INSERT 30176 1
::
:: tms=>INSERT INTO tmsrout010 VALUES ( 66, 66, 66, 66) ;
:: INSERT 30177 1
::
:: tms=> rollback;
:: NOTICE: ROLLBACK: no transaction in progress
:: NOTICE: ROLLBACK: no transaction in progress
:: ROLLBACK
::
:: tms=> select * from tmsrout010;
:: node_id | name | location | ip_address
:: ---------+------+----------+------------
:: 55 | 55 | 55 | 55
:: 66 | 66 | 66 | 66
:: (2 rows)
::
:: 위에 결과로 보면 transaction 관리가 되지 안는 것으로 생각 됩니다.
:: (auto commit 으로 되어 있는 것 같습니다.)
::
:: transaction 관리를 하려면 무슨 방법을 사용 해야 하는 가요.
::
:: 위 예제는 sample로 보여드리는 예제이며
::
:: 실질적으로는
::
:: PL/pgSQL 에서 error 발생시 지금까지처리해온 모든 transaction을
::
:: ROLLBACK 으로 처리해야 합니다..
::
:: 감사합니다.
::
::
::
::
::
|