首页 > 解决方案 > Progress-4gl:事务范围如何应用于外部程序调用?

问题描述

我需要一些帮助来理解当前程序之外的过程/程序的事务范围。

假设我有三个程序,程序 A、程序 B 和程序 C。在程序 A 中,我有一个过程,其中有一些行包含在一个do transaction(非强类型)块中。在该do transaction块内,它调用另一个程序 B。从程序 B 返回时,有一个撤消,离开命令。在同一个事务块中,它调用程序 C 并且有一个撤销,在这个调用之后也离开。

我的问题是,如果在事务块内,程序 B 执行没有错误,但程序 c 返回错误,那么程序 C 调用后的 undo,leave 是否也会撤消程序 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.

标签: openedgeprogress-4gl

解决方案


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

与其说它本身是“扩展的”,不如说是事务包括从该会话一直启用到它被提交或回滚的时间点发生的所有事情。内部过程、外部过程、用户定义的函数、类的方法、触发代码等。

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

当涉及应用服务器时,事情会变得一团糟。原始调用者没有(内置)能力知道在被调用的应用服务器会话中回滚什么。应用服务器调用可能会返回一个错误,导致调用者在遇到问题时回滚,但调用者也可以决定捕获并忽略该错误。


推荐阅读