Progress-4gl : 트랜잭션 범위는 외부 프로그램 호출에 어떻게 적용됩니까?
현재 프로그램 외부의 절차 / 프로그램에 대한 트랜잭션 범위를 이해하는 데 도움이 필요합니다.
프로그램 A, 프로그램 B, 프로그램 C의 세 가지 프로그램이 있다고 가정 해 보겠습니다. 프로그램 A 안에는 do transaction
(강력한 형식이 아닌) 블록 안에 몇 줄이 래핑 된 프로 시저가 있습니다 . 해당 do transaction
블록 내에서 다른 프로그램 B를 호출합니다. 프로그램 B에서 돌아 오면 실행 취소, 나가기 명령이 있습니다. 동일한 트랜잭션 블록 내에서 프로그램 C를 호출하고 실행 취소 기능이 있습니다.
내 질문은 트랜잭션 블록 내에서 프로그램 B가 오류없이 실행되지만 프로그램 c가 오류를 반환 한 경우 프로그램 C 호출 후 실행 취소, 종료하면 프로그램 B 내부에서 발생한 트랜잭션도 실행 취소됩니까?
Procedure do_something:
some processing....
do transaction:
error-message = "".
{run programB.p}
if error-message <> "" then undo, leave.
some further processing...
error-message = "".
{run programC.p}
if error-message <> "" then undo, leave.
end. /* end of do transaction */
end procedure.
답변
예. 트랜잭션 블록에서 일어나는 모든 일이 취소됩니다.
예. 설명하는 예에서는 모든 것이 롤백됩니다.
그 자체로 "확장"되는 것이 아니라 트랜잭션 이 커밋되거나 롤백 될 때까지 활성화 된 시점부터 해당 세션 에서 발생하는 모든 것을 포함한다는 것입니다 . 내부 절차, 외부 절차, 사용자 정의 함수, 클래스 메서드, 트리거 코드 등
"해당 세션에서"는 중요합니다. 앱 서버에서 프로 시저를 호출하는 경우 해당 활동은 고유 한 트랜잭션 컨텍스트가있는 자체 프로세스이므로 포함되지 않습니다.
앱 서버가 관련되면 일이 복잡해집니다. 원래 호출자는 호출 된 앱 서버 세션에서 롤백 할 항목을 알 수있는 (내장 된) 기능이 없습니다. 앱 서버 호출 은 문제가 발생하는 경우 호출자가 롤백하도록하는 오류를 반환 할 수 있지만 호출자는 해당 오류를 트랩하고 무시하도록 결정할 수도 있습니다.