데이터베이스 액세스로 인한 오류로부터 회복PostgreSQL : 문서 : 18 : 42.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
) 롤백을 일으키지 마십시오.