지원되는 버전 :현재 (17)16 / 15 / 14 / 13
개발 버전 :Devel
지원되지 않는 버전 :12 / 11 / 10
이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

43.9. PL/토토 베이에서의 명시 적 차축

데이터베이스 액세스로 인한 오류로부터의 복구섹션 43.8중 하나가 실패하기 전에 일부 작업이 성공하는 바람직하지 않은 상황으로 이어질 수 있으며, 오류에서 복구 한 후에는 데이터가 일관되지 않은 상태로 남습니다. PL/토토 베이은이 문제에 대한 솔루션을 명시적인 하위 트랜잭션 형태로 제공합니다.

두 계정 사이의 전송을 구현하는 함수를 고려하십시오.

함수 생성 송금 _funds ()는 void를 $$로 반환합니다

두 번째 인 경우업데이트명령문은 예외를 제기하고,이 기능은 실패를 기록하지만 첫 번째 결과는업데이트그럼에도 불구하고 커밋 될 것입니다. 다시 말해, 자금은 Joe의 계정에서 철회되지만 Mary의 계좌로 이체되지는 않습니다.SPI_EXEC별도의 하위 트랜잭션이며, 해당 하위 트랜잭션 중 하나만 롤백되었습니다.

이러한 사례를 처리하려면 여러 데이터베이스 작업을 명시 적 서브 트랜잭션으로 래핑 할 수 있으며, 이는 전체적으로 성공하거나 롤백 할 수 있습니다. PL/토토 베이 제공 aSubTransaction이것을 관리하는 명령. 우리는 다음과 같이 우리의 기능을 다시 작성할 수 있습니다.

함수 생성 송금 _funds2 ()는 $$로 무효를 반환합니다

사용캐치이 목적을 위해서는 여전히 필요합니다. 그렇지 않으면 오류가 함수의 최상위 레벨로 전파되어 원하는 삽입이에 삽입됩니다.운영테이블. 그만큼SubTransaction명령은 오류를 가로막지 않으며, 오류가보고되면 범위 내부에서 실행 된 모든 데이터베이스 작업이 함께 롤백되도록합니다..

명시 적 서브 트랜잭션의 롤백은 데이터베이스 액세스에서 발생하는 오류뿐만 아니라 포함 된 토토 베이 코드에서보고 한 오류에서 발생합니다. 따라서 a 내부에서 제기 된 정기적 인 토토 베이 예외.SubTransaction명령으로 인해 서브 트랜잭션이 롤백됩니다. 그러나 비 방향은 포함 된 토토 베이 코드에서 나가는 것입니다 (예 :return) 롤백을 일으키지 마십시오.