Progress-4gl:事务范围如何应用于外部程序调用?
Progress-4gl: How does transaction scope apply to external program calling?
我需要一些帮助来理解 procedures/programs 当前程序之外的事务范围。
假设我有三个程序,程序 A、程序 B 和程序 C。在程序 A 中,我有一个过程,其中有一些行包含在 do transaction
(非强类型)块中.在那个 do transaction
块中,它调用另一个程序 B。在程序 B 的 return 上有一个撤消,离开命令。在同一个事务块中,它调用程序 C 并有一个撤消,在这个调用之后也离开。
我的问题是,如果在事务块内,程序 B 执行没有错误,但程序 C return 出错了,程序 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.
是的。事务块中发生的所有事情都将被撤消。
是的。在您描述的示例中,所有内容都会回滚。
与其说它本身是“扩展”的,不如说交易包括从启用所有时间点开始在该会话中发生的所有事情直到提交或回滚的方式。内部程序、外部程序、用户自定义函数、方法类、触发代码等
“在该会话中”很重要 - 如果您在应用程序服务器上调用过程,则 activity 不包括在内,因为它是自己的进程,具有自己独特的事务上下文。
当涉及应用程序服务器时,事情会变得一团糟。原始调用者没有 (built-in) 能力知道在被调用的应用程序服务器会话中回滚什么。应用程序服务器调用 可能 return 一个错误,导致调用者在遇到问题时回滚,但调用者也可以决定捕获并忽略该错误。
我需要一些帮助来理解 procedures/programs 当前程序之外的事务范围。
假设我有三个程序,程序 A、程序 B 和程序 C。在程序 A 中,我有一个过程,其中有一些行包含在 do transaction
(非强类型)块中.在那个 do transaction
块中,它调用另一个程序 B。在程序 B 的 return 上有一个撤消,离开命令。在同一个事务块中,它调用程序 C 并有一个撤消,在这个调用之后也离开。
我的问题是,如果在事务块内,程序 B 执行没有错误,但程序 C return 出错了,程序 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.
是的。事务块中发生的所有事情都将被撤消。
是的。在您描述的示例中,所有内容都会回滚。
与其说它本身是“扩展”的,不如说交易包括从启用所有时间点开始在该会话中发生的所有事情直到提交或回滚的方式。内部程序、外部程序、用户自定义函数、方法类、触发代码等
“在该会话中”很重要 - 如果您在应用程序服务器上调用过程,则 activity 不包括在内,因为它是自己的进程,具有自己独特的事务上下文。
当涉及应用程序服务器时,事情会变得一团糟。原始调用者没有 (built-in) 能力知道在被调用的应用程序服务器会话中回滚什么。应用程序服务器调用 可能 return 一个错误,导致调用者在遇到问题时回滚,但调用者也可以决定捕获并忽略该错误。