4D v16.3

Suspender las transacciones

Inicio

 
4D v16.3
Suspender las transacciones

Suspender las transacciones  


 

Suspender una transacción es útil cuando se necesita, dentro de una transacción, realizar ciertas operaciones que no necesitan ser ejecutadas bajo el control de esta transacción. Por ejemplo, imaginemos el caso de que un cliente hace un pedido, dentro de una transacción y también actualiza su dirección. A continuación, el cliente cambia de opinión y se cancela la orden. La transacción se cancela, pero usted no quiere que el cambio de dirección se revierta. Este es un ejemplo típico en el que suspender la transacción es útil. Tres comandos se utilizan para suspender y reanudar las transacciones:

  • SUSPEND TRANSACTION: detiene la transacción actual. Todos los registros actualizados o añadidos permanecen bloqueados.
  • RESUME TRANSACTION: reactiva una transacción suspendida.
  • Active transaction: devuelve False si la transacción se suspende o si no hay ninguna transacción actual y True si se inicia o reactiva.

Ejemplo  

Este ejemplo ilustra la necesidad de suspender una transacción. En una base de datos de facturas, queremos obtener un nuevo número de la factura durante una transacción. Este número se calcula y se almacena en una tabla [Settings]. En un entorno multiusuario, los accesos concurrentes deben estar protegidos; Sin embargo, por la transacción, la tabla [Settings] podría ser bloqueada por otro usuario a pesar de que estos datos sean independientes de la transacción principal. En este caso, puede suspender la transacción cuando se accede a la tabla.

  //Método estándar que crea una factura
 START TRANSACTION
 ...
 CREATE RECORD([Invoices])
 [Invoices]InvoiceID:=GetInvoiceNum //llama al método para obtener un número disponible
 ...
 SAVE RECORD([Invoices])
 VALIDATE TRANSACTION

El método GetInvoiceNum suspende la transacción antes de ejecutarla. Note que este código funcionará incluso si el método se llama desde fuera de una transacción:

  //Método proyecto GetInvoiceNum
  //GetInvoiceNum -> Siguiente número de factura disponible
 C_LONGINT($0)
 SUSPEND TRANSACTION
 ALL RECORDS([Settings])
 If(Locked([Settings])) //Acceso multi-usuario
    While(Locked([Settings]))
       MESSAGE("Waiting for locked Settings record")
       DELAY PROCESS(Current process;30)
       LOAD RECORD([Settings])
    End while
 End if
 [Settings]InvoiceNum:=[Settings]InvoiceNum+1
 $0:=[Settings]InvoiceNum
 SAVE RECORD([Settings])
 UNLOAD RECORD([Settings])
 RESUME TRANSACTION

Cuando se suspende una transacción, se aplican los siguientes principios:

  • Puede acceder a los registros que se han añadido o modificado durante la transacción y no puede acceder a los registros que se han eliminado durante la transacción.
  • Puede crear, guardar, eliminar o modificar los registros fuera de la transacción.
  • Puede iniciar una nueva transacción, pero dentro de esta transacción incluida, no podrá ver los registros o los valores de registros que se han añadido o modificado durante la transacción suspendida. De hecho, esta nueva transacción es totalmente independiente de la que se ha suspendido, similar a una transacción de otro proceso y ya que la transacción suspendida más tarde podría reanudarse o cancelarse, cualquier registro añadido o modificado se oculta automáticamente para la nueva transacción. Tan pronto como confirme o cancele la nueva transacción, puede ver estos registros de nuevo.
  • Todos los registros que son modificados, eliminados o añadidos dentro de la transacción suspendida permanecen bloqueados para otros procesos. Si intenta modificar o eliminar estos registros fuera de la transacción o en una nueva transacción, se genera un error.

Estas implementaciones se resumen en el siguiente gráfico:   

Los valores editados durante la transacción A (registro ID1 toma el valor Val11) no están disponibles en una nueva transacción (B) creada durante el período "suspendido". Los valores editados durante el período de suspensión (registro ID2 toma el valor Val22 y registro ID3 toma el valor Val33), se conservan después de que se cancela la transacción A.

Las funcionalidades específicas se han añadido para manejar los errores:

  • El registro actual de cada tabla se bloquea temporalmente si se modifica durante la transacción y se desbloquea automáticamente cuando se reanuda la operación. Este mecanismo es importante para evitar que partes de la transacción se guarden de forma inesperada.
  • Si se ejecuta una secuencia inválida tal como, iniciar transacción / suspender transacción / iniciar transacción / reactivar transacción, se genera un error. Este mecanismo evita que los desarrolladores olviden confirmar o cancelar las sub transacciones incluidas antes de reanudar la operación suspendida.

El comando existente In transaction devuelve True cuando se ha iniciado una transacción, incluso si está suspendida. Para saber si se suspende la transacción actual, es necesario utilizar el nuevo comando Transacción activa, que devuelve False en este caso.

Ambos comandos, sin embargo, también devuelven False si no se ha iniciado ninguna transacción. Después puede ser necesario utilizar el comando Transaction level, que devuelve 0 en este contexto (ninguna operación iniciada).

El siguiente gráfico ilustra los diversos contextos de transacción y los valores correspondientes devuelto por los comandos de transacción:



Ver también 


Active transaction
RESUME TRANSACTION
SUSPEND TRANSACTION

 
PROPIEDADES 

Producto: 4D
Tema: Transacciones

 
HISTORIA 

Creado por: 4D v15 R4

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)