데이터베이스 액세스로 인한 오류로부터 회복PostgreSQL : 문서 : 13 : 43.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
) 롤백을 일으키지 마십시오.
문서에 맞지 않는 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면