2014-10-04 6 views
0

PostgresSQL에서 분리 수준 인 REPEATABLE_READ에서 실행하는 함수를 생성했다고 가정합니다.PostgreSQL에서`동시 업데이트 '오류를 잡습니다.

CREATE FUNCTION some_stuff() RETURNS void AS $$ BEGIN -- do stuff that could throw an error END; $$ LANGUAGE plpgsql;

이 함수는 내부적으로 다음과 같은 오류 던져하는 것이 가능 : ERROR: could not serialize access due to concurrent update합니다. 이 오류를 포착하고 내부적으로 함수/트랜잭션을 반복하는 방법이 있습니까? 그래서 이런 일이 :

CREATE FUNCTION some_stuff() RETURNS void AS $$ BEGIN try { -- do stuff that could throw an error } catch (error) { call some_stuff(); } END; $$ LANGUAGE plpgsql;

을 또는이 오류는이 연료 소모량을 호출되는 즉 자바 응용 프로그램 수준에서 수행 할 잡기있다?

답변

1

It's possible for this function internally to throw the following error: ERROR: could not serialize access due to concurrent update . Is there a way to catch this error and repeat the function/transaction internally?

아니요, 아닙니다.

PostgreSQL의 기능은 트랜잭션이 진행 중이 아닌 경우 암시 적으로 래핑됩니다. repeatable read 또는 serializable 격리 기능 내에서 새 트랜잭션 스냅 샷을 얻을 수있는 방법이 없습니다. 롤백하고 새 트랜잭션을 시작할 수 없습니다.

PostgreSQL가 작동하려면 자발적인 커밋을 통해 최상위 절차를 지원해야합니다.

별도의 연결에 제어 코드가 있어야합니다. 이는 클라이언트에서 수행하거나, (ab) dblink을 사용하는 것을 의미합니다.

+0

약 :'이미 진행 중이 아닌 트랜잭션에 암시 적으로 래핑됩니다 .'. A와 B의 두 함수가 있고 내부적으로 B가 내부적으로 B를 호출하면 하나의 트랜잭션 (A 실행을 위해 생성됨)이 있고 B가 실행된다는 것을 의미합니까? ('A '가 호출 할 때)이 단일 트랜잭션 내에서 수행되고 있습니까? – insumity

+1

@foobar 수정. 중첩 된 트랜잭션 (begin/except blocks, subtransactions)은 가능하지만 자율적 인 확약 또는 트랜잭션 일시 중단/재개는 불가능합니다. –