데이터베이스 액세스로 인한 오류로부터의 복구섹션 43.8중 하나가 실패하기 전에 일부 작업이 성공하는 바람직하지 않은 상황으로 이어질 수 있으며, 오류에서 복구 한 후에는 데이터가 일관되지 않은 상태로 남습니다. PL/토토 베이은이 문제에 대한 솔루션을 명시적인 하위 트랜잭션 형태로 제공합니다.
두 계정 사이의 전송을 구현하는 함수를 고려하십시오.
함수 생성 송금 _funds ()는 void를 $$로 반환합니다
두 번째 인 경우업데이트
명령문은 예외를 제기하고,이 기능은 실패를 기록하지만 첫 번째 결과는업데이트
그럼에도 불구하고 커밋 될 것입니다. 다시 말해, 자금은 Joe의 계정에서 철회되지만 Mary의 계좌로 이체되지는 않습니다.SPI_EXEC
별도의 하위 트랜잭션이며, 해당 하위 트랜잭션 중 하나만 롤백되었습니다.
이러한 사례를 처리하려면 여러 데이터베이스 작업을 명시 적 서브 트랜잭션으로 래핑 할 수 있으며, 이는 전체적으로 성공하거나 롤백 할 수 있습니다. PL/토토 베이 제공 aSubTransaction
이것을 관리하는 명령. 우리는 다음과 같이 우리의 기능을 다시 작성할 수 있습니다.
함수 생성 송금 _funds2 ()는 $$로 무효를 반환합니다
사용캐치
이 목적을 위해서는 여전히 필요합니다. 그렇지 않으면 오류가 함수의 최상위 레벨로 전파되어 원하는 삽입이에 삽입됩니다.운영
테이블. 그만큼SubTransaction
명령은 오류를 가로막지 않으며, 오류가보고되면 범위 내부에서 실행 된 모든 데이터베이스 작업이 함께 롤백되도록합니다..
명시 적 서브 트랜잭션의 롤백은 데이터베이스 액세스에서 발생하는 오류뿐만 아니라 포함 된 토토 베이 코드에서보고 한 오류에서 발생합니다. 따라서 a 내부에서 제기 된 정기적 인 토토 베이 예외.SubTransaction
명령으로 인해 서브 트랜잭션이 롤백됩니다. 그러나 비 방향은 포함 된 토토 베이 코드에서 나가는 것입니다 (예 :return
) 롤백을 일으키지 마십시오.