Transacciones y sincronización - consulta

Estimados amigos, se me ha presentado un caso en el que debo actualizar más de una tabla que no están relacionadas por claves, por lo que no me resulta posible utilizar una relación para asegurarme la sincronización del conjunto de tablas.

Dado que el método sincronizar() de cada DT es independiente de los demás, de nada sirve encerrar en un try…catch del php dos o tres sincronizaciones, dado que la falla en una de ellas no deshará las sicronizaciones que la precedieron.

Deseo saber (yo no me avivo) si es posible iniciar una transacción que englobe las sincronizaciones desde toba puro, sin crear una sentencia sql que lo haga a la manera tradicional y usar el método toba::db()->consultar($sql).

Espero no estar preguntando una burrada y que de paso el tema le sirva a otros.

Un cordial saludo y gracias por su atención.

Hola, yo esa situacion la resolvi con el siguiente codigo:
La idea es, tengo que actualizar un registro de la tabla1 y dicho registro guardar en la tabla2 con Atomicidad (transaccion entre las dos operaciones)

    $this->dep('tabla1')->get_persistidor()->desactivar_transaccion();
    $this->dep('tabla2')->get_persistidor()->desactivar_transaccion();
    toba::db()->abrir_transaccion();
    $this->dep('tabla1')->set($regseleccionado);
    $this->dep('tabla1')->sincronizar();
    $this->dep('tabla2')-> nueva_fila($regseleccionado);
    $this->dep('tabla2')-> sincronizar();
    $this->dep('tabla1')->resetear();
    $this->dep('tabla1')->resetear();
    toba::db()->cerrar_transaccion();

Hola!

Dado que el método sincronizar() de cada DT es independiente de los demás, de nada sirve encerrar en un try...catch del php dos o tres sincronizaciones, dado que la falla en una de ellas no deshará las sicronizaciones que la precedieron.

Eso es cierto, pero lo tendrías que hacer dentro de otra transaccion. Algo como esto:


toba::db()->abrir_transaccion();
try
  //acá realizarías tus sincronizaciones
  toba::db()->cerrar_transaccion();
catch
  toba::db()->abortar_transaccion();

Desde ya, habría que confirmar que este tipo de llamadas sea soportado, es decir, que se permita anidación de transacciones (yo asumo que si, ya que postgresql soporta anidación de transacciones, pero…)

Hola Gente,

Claudio, en particular tenes que hacer una mezcla de la respuesta que te dieron los chicos. Quedaria algo asi.


<?php
$this->dep('tabla1')->persistidor()->desactivar_transaccion();
$this->dep('tabla2')->persistidor()->desactivar_transaccion();
toba::db()->abrir_transacccion();
try {
      $this->dep('tabla1')->sincronizar();
      $this->dep('tabla2')->sincronizar();
      toba::db()->cerrar_transaccion();
} catch (toba_error_db $e) {
      toba::db()->abortar_transaccion();
      throw $e;
}
$this->tabla('tabla1')->resetear();
$this->tabla('tabla2')->resetear();
?>

@Martin: No se como sera en las versiones nuevas de Postgres… pero hasta donde yo se transacciones anidadas no soporta, lo que si usabamos nosotros para simularlas eran checkpoints, que son mas versatiles… pero no es lo mismo que una transaccion, hay que hacer un manejo mas explicito.

Saludos

Hola
según http://www.postgresql.org/docs/8.2/static/tutorial-transactions.html, se soporta transacciones anidadas a través de SAVEPOINTS (creo que desde la 8.0).
Esto está soportado en las APIs de Toba?
Como lo implementarías llegado el caso?

Justamente lo que te decia, son checkpoints a los cuales podes volver… que es bastante diferente a hacer dos ‘Begin transaction;’.

Sisi, eso esta claro. Pero hay que hacerlo a mano? O hay alguna API de Toba que encapsule esta alternativa SavePoints?

En toba_db existen metodos para usar savepoints.

Saludos