jre7 - postgresql transaction rollback




postgresql 8.2의 중첩 트랜잭션? (2)

그럼 SavePoint를 사용하여 postgresql 내에서 중첩 된 트랜잭션을 사용할 수 있습니다.

다음 코드 예제를 사용하십시오.

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

아마 이것은 당신을 조금 도와 줄 것입니다.

데이터베이스 스키마 업데이트를 적용하는 스크립트 작업을하고 있습니다. 시작 트랜잭션 / 커밋을 사용하여 모든 SQL 업데이트 스크립트를 설치했습니다. 나는이 스크립트들을 명령 행에서 psql에 전달한다.

이제는 동시에 여러 스크립트를 적용해야하며 한 트랜잭션에서 적용해야합니다. 지금까지 제가 생각해 낸 유일한 해결책은 원래의 스크립트 집합에서 트랜잭션 시작 / 커밋을 제거한 다음 새로운 시작 트랜잭션 / 커밋 블록 내부에서 함께 처리하는 것입니다. 나는 이것을 펄 스크립트로 작성하고있다.

효과적으로 나는 postgresql에서하는 방법을 알 수없는 중첩 된 트랜잭션을 원한다.

이러한 목적으로 중첩 된 트랜잭션을 수행하거나 시뮬레이트 할 수있는 방법이 있습니까? 나는 모든 오류에 대해 자동으로 구제 조치를 취할 수 있도록 설정 했으므로 하위 항목 중 하나라도 실패 할 경우 최상위 수준 트랜잭션에서 계속할 필요가 없습니다.


나는 아웃 오브 밴드 (out of band)를 '해결'하는 것을 끝내었다. 나는 perl 스크립트를 사용하여 입력 스크립트를 다시 시작하여 트랜잭션 시작 / 커밋을 제거하고 모든 것을 하나의 파일로 푸시한다. 범하다.







transactions