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.
Ответы
Да. Все, что происходит в блоке транзакции, будет отменено.
Да. В примере, который вы описываете, все откатывается.
Дело не в том, что она «расширена» как таковая, а в том, что транзакция включает в себя все, что происходит в этом сеансе, с момента его включения до тех пор, пока не будет зафиксировано или откатано. Внутренние процедуры, внешние процедуры, определяемые пользователем функции, методы классов, код триггера и т. Д.
«В этом сеансе» важен - если вы вызываете процедуру на сервере приложений, эта активность НЕ включается, поскольку это отдельный процесс со своим собственным отдельным контекстом транзакции.
Когда задействованы серверы приложений, все становится беспорядочно. Первоначальный вызывающий объект не имеет (встроенной) возможности знать, что нужно откатить в вызываемом сеансе сервера приложений. Вызов сервера приложений может вернуть ошибку, которая заставит вызывающего абонента откатиться, если он столкнется с проблемами, но вызывающий также может решить перехватить и проигнорировать эту ошибку.