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.

解决方法

是的。在您描述的示例中,所有内容都会回滚。

它本身并没有什么“扩展”,而仅仅是事务包含了从整个启用之时起一直在该会话中在该会话中发生的所有事情。提交或回滚。内部过程,外部过程,用户定义的函数,类的方法,触发代码等。

“在该会话中”很重要-如果您在应用服务器上调用一个过程,则不包含活动,因为活动是它自己的过程,具有自己的不同事务上下文。

当涉及应用服务器时,事情会变得混乱。原始调用方没有(内置)功能,无法知道在被调用的应用程序服务器会话中要回滚的内容。应用服务器调用可以返回错误,如果遇到问题,该错误会导致调用方回滚,但调用方还可以决定捕获并忽略该错误。

,

是的。交易区块中发生的所有事情都将被撤消。