Progress-4gl: ¿Cómo se aplica el alcance de la transacción a las llamadas a programas externos?

Aug 20 2020

Necesito ayuda para entender el alcance de transacciones para procedimientos/programas fuera del programa actual.

Supongamos que tengo tres programas, el programa A, el programa B y el programa C. Dentro del programa A, tengo un procedimiento que tiene algunas líneas envueltas dentro de un do transactionbloque (no fuertemente tipado). Dentro de ese do transactionbloque, llama a otro Programa B. Al regresar del programa B, hay un comando de deshacer, dejar. Dentro del mismo bloque de transacción, llama al programa C y tiene un deshacer, salir después de esta llamada también.

Mi pregunta es, si dentro del bloque de transacciones, el programa B se ejecuta sin errores, pero el programa c devolvió un error, ¿deshacer, dejar después de que la llamada del programa C también deshaga las transacciones que ocurrieron dentro del programa 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.

Respuestas

4 MikeFechner Aug 20 2020 at 02:58

Sí. Todo lo que suceda en el bloque de transacciones se deshará.

5 TomBascom Aug 20 2020 at 04:01

Sí. En el ejemplo que describe, todo se revierte.

No es tanto que esté "extendido" per se, sino que la transacción incluye todo lo que sucede en esa sesión desde el momento en que se habilita hasta que se confirma o se deshace. Procedimientos internos, procedimientos externos, funciones definidas por el usuario, métodos de clases, código de activación, etc.

"En esa sesión" es importante: si llama a un procedimiento en un servidor de aplicaciones, esa actividad NO está incluida, ya que es su propio proceso con su propio contexto de transacción distinto.

Cuando los servidores de aplicaciones están involucrados, las cosas se complican. La persona que llama original no tiene capacidad (integrada) para saber qué revertir en la sesión del servidor de aplicaciones llamada. La llamada del servidor de aplicaciones podría devolver un error que haga que la persona que llama retroceda si encuentra problemas, pero la persona que llama también podría decidir interceptar e ignorar ese error.