44.9. PL/무지개 토토에서의 명시 적 차축

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

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

함수 생성 송금 _funds ()는 void를 $$로 반환합니다
    If [catch 
        SPI_EXEC "업데이트 계정 세트 밸런스 = 밸런스 -10 여기서 Account_Name = 'joe'"
        SPI_EXEC "업데이트 계정 세트 밸런스 = 밸런스 + 100 여기서 Account_Name = 'Mary'"
     errormsg] 
        결과 설정 [형식 "오류 전송 자금 : %s"$ errormsg]
     또 다른 
        결과 설정 "성공적으로 양도 된 자금"

    SPI_EXEC "작업에 삽입 (결과) 값 ( '[QUOTE $ result]')"
$$ 언어 pl무지개 토토;

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

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

함수 생성 송금 _funds2 ()는 void를 $$로 반환합니다
    If [catch 
        subrantaction 
            SPI_EXEC "업데이트 계정 세트 밸런스 = 밸런스 -10 여기서 Account_Name = 'joe'"
            SPI_EXEC "업데이트 계정 세트 밸런스 = 밸런스 + 100 여기서 Account_Name = 'Mary'"

     errormsg] 
        결과 설정 [형식 "오류 전송 자금 : %s"$ errormsg]
     또 다른 
        결과 설정 "성공적으로 양도 된 자금"

    SPI_EXEC "작업에 삽입 (결과) 값 ( '[QUOTE $ result]')"
$$ 언어 pltcl;

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

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

정정 제출

문서에 맞지 않는 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면