SJa*_*aka 1 progress-4gl openedge
我需要一些帮助来理解当前程序之外的程序/程序的事务范围。
假设我有三个程序,程序 A、程序 B 和程序 C。在程序 A 中,我有一个过程,其中有一些行包含在do transaction(非强类型)块中。在那个do transaction块中,它调用另一个程序 B。从程序 B 返回时,有一个撤消,离开命令。在同一个事务块内,它调用程序C并有一个undo,在这个调用之后也离开。
我的问题是,如果在事务块内,程序 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.
Run Code Online (Sandbox Code Playgroud)
是的。在您描述的示例中,一切都会回滚。
与其说它本身被“扩展”了,还不如说事务包括从启用它一直到它被提交或回滚的时间点在该会话中发生的所有事情。内部过程、外部过程、用户定义函数、类方法、触发代码等。
“在那个会话中”很重要 - 如果您在应用程序服务器上调用一个过程,该活动不包括在内,因为它是具有自己独特事务上下文的自己的进程。
当涉及应用服务器时,事情会变得混乱。原始调用者没有(内置)能力知道在被调用的应用程序服务器会话中回滚什么。应用服务器调用可能会返回一个错误,导致调用者在遇到问题时回滚,但调用者也可以决定捕获并忽略该错误。
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |