이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 42.9. PL/와이즈 토토에서의 명시 적 차축버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

42.9. PL/무지개 토토의 명시적 하위 트랜잭션#

설명된 대로 데이터베이스 액세스로 인해 발생한 오류 복구 중PostgreSQL : 문서 : 개발 : 42.8. PL/스포츠 토토 사이트에서의 오류 처리일부 작업 중 하나가 실패하기 전에 일부 작업이 성공하고 해당 오류에서 복구한 후 데이터가 일관되지 않은 상태로 남아 있는 바람직하지 않은 상황이 발생할 수 있습니다. PL/무지개 토토은 명시적 하위 트랜잭션의 형태로 이 문제에 대한 솔루션을 제공합니다.

두 계정 간의 이체를 구현하는 기능을 고려해보세요:

함수 생성 transfer_funds() $$로 무효 반환
    만약 [잡다 
        spi_exec "계정 업데이트 잔액 설정 = 잔액 - 100 WHERE account_name = 'joe'"
        spi_exec "계정 업데이트 SET 잔액 = 잔액 + 100 WHERE account_name = 'mary'"
     오류 메시지] 
        결과 설정 [형식 "자금 이체 오류: %s" $errormsg]
     그렇지 않으면 
        결과 "자금이 성공적으로 이체되었습니다" 설정

    spi_exec "INSERT INTO 작업(결과) VALUES('[quote $result]')"
$$ 언어 pl무지개 토토;

만약 두 번째업데이트문 결과 예외가 발생합니다. 이 함수는 실패를 기록하지만 첫 번째 결과는업데이트그럼에도 불구하고 커밋됩니다. 즉, Joe의 계좌에서 자금이 인출되지만 Mary의 계좌로 이체되지는 않습니다. 이는 각각의 이유 때문에 발생합니다.spi_exec별도의 하위 트랜잭션이며 해당 하위 트랜잭션 중 하나만 롤백되었습니다.

이러한 경우를 처리하려면 여러 데이터베이스 작업을 명시적인 하위 트랜잭션으로 래핑하여 전체적으로 성공하거나 롤백할 수 있습니다. PL/Tcl은 다음을 제공합니다.하위 거래이것을 관리하는 명령입니다. 함수를 다음과 같이 다시 작성할 수 있습니다.

함수 생성 transfer_funds2() $$로 무효 반환
    만약 [잡다 
        하위 거래 
            spi_exec "계정 업데이트 잔액 설정 = 잔액 - 100 WHERE account_name = 'joe'"
            spi_exec "계정 업데이트 SET 잔액 = 잔액 + 100 WHERE account_name = 'mary'"

     오류 메시지] 
        결과 설정 [형식 "자금 이체 오류: %s" $errormsg]
     그렇지 않으면 
        결과 "자금이 성공적으로 이체되었습니다" 설정

    spi_exec "INSERT INTO 작업(결과) VALUES('[quote $result]')"
$$ 언어 pltcl;

다음 사용에 유의하세요.잡기11118_11269작업테이블.하위 거래명령은 오류를 트랩하지 않으며 오류가 보고될 때 해당 범위 내에서 실행된 모든 데이터베이스 작업이 함께 롤백되도록만 보장합니다.

명시적인 하위 트랜잭션의 롤백은 데이터베이스 액세스에서 발생한 오류뿐만 아니라 포함된 무지개 토토 코드에 의해 보고된 모든 오류에서 발생합니다. 따라서 a 내부에서 일반 무지개 토토 예외가 발생했습니다.하위 트랜잭션명령은 또한 하위 트랜잭션이 롤백되도록 합니다. 그러나 포함된 Tcl 코드에서 오류가 없이 종료됩니다(예: 다음으로 인해).반환) 롤백을 발생시키지 않습니다.