Poo + pdo + transacciones

  • Autor Autor Caffa
  • Fecha de inicio Fecha de inicio
Caffa

Caffa

Delta
Social Media
Verificación en dos pasos activada
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola betas !

Estoy en un proyecto web simple de un administrador de trabajos diarios para una empresa. Básicamente es la carga de tareas, y a las mismas poder asociarle trabajos. Lo que estoy necesitando es poder implementar las transacciones de pdo, pero dentro del formato de la programación orientada a objetos.

Una situación sería que alguien cargue un trabajo y de por finalizada una tarea. En este caso estaría trabajando con trabajos y con tareas, haciendo updates a dos tablas diferentes. Lo que yo necesito es poder meter todo dentro de una transacción para que en el caso que algo falle me devuelva un error y no deje las cosas por la mitad.

Mi problema es que al trabajar con objetos yo tengo las cosas divididas y no se como manejar la situacion. Alguien tiene algún instructivo, o web con referencias a esto que me pueda ayudar ?

Gracias!!!
 
Puedes dejar detalles del código para que puedan ayudarte un poco mejor en lo que necesitas.

Recuerda que las transacciones son consultas procedimentales que si en caso tal no se termina de ejecutar correctamente el servidor detiene el proceso id y continua con el siguiente en cola. Es parecido al concepto de heap o stack analógicamente hablando de transacciones y procesamiento de datos de bajo nivel. El compañero de arriba te dejo el enlace del manual de PHP.
 
Pues con esos pocos detalles no te podemos ayudar mucho.
Pero lo básico es:
PHP:
// DESHABILITAR EL AUTOCOMMIT
$db->beginTransaction();

// REALIZAR LAS CONSULTAS NECESARIAS
$db->query('....');

// COMPROBAR SI HAY ERROR
if(...){
   // SI HAY ERROR DESHECHAR LOS CAMBIOS
   $db->rollBack();
} else {
   // SI NO HAY ERROR, HACEMOS COMMIT PARA GUARDAR LOS CAMBIOS
   $db->commit();
}

Puedes utilizar otra estructura de código, pero los métodos básicos que debes utilizar son esos.
 
Lo que quieres hacer es un poco complejo, pero con una descripción general y sin dar detalles de la plataforma que usas, es un poco difícil que podamos ayudarte.
Si fuéramos adivinos no estaríamos trabajando en esto.
 
Lo que quieres hacer es un poco complejo, pero con una descripción general y sin dar detalles de la plataforma que usas, es un poco difícil que podamos ayudarte.
Si fuéramos adivinos no estaríamos trabajando en esto.

Pues con esos pocos detalles no te podemos ayudar mucho.
Pero lo básico es:
PHP:
// DESHABILITAR EL AUTOCOMMIT
$db->beginTransaction();

// REALIZAR LAS CONSULTAS NECESARIAS
$db->query('....');

// COMPROBAR SI HAY ERROR
if(...){
   // SI HAY ERROR DESHECHAR LOS CAMBIOS
   $db->rollBack();
} else {
   // SI NO HAY ERROR, HACEMOS COMMIT PARA GUARDAR LOS CAMBIOS
   $db->commit();
}

Puedes utilizar otra estructura de código, pero los métodos básicos que debes utilizar son esos.

Puedes dejar detalles del código para que puedan ayudarte un poco mejor en lo que necesitas.

Recuerda que las transacciones son consultas procedimentales que si en caso tal no se termina de ejecutar correctamente el servidor detiene el proceso id y continua con el siguiente en cola. Es parecido al concepto de heap o stack analógicamente hablando de transacciones y procesamiento de datos de bajo nivel. El compañero de arriba te dejo el enlace del manual de PHP.

A que te refieres con que "estás trabajando con objetos"?

PHP: PDO::beginTransaction - Manual

Si, disculpen si no fui claro. Estoy diseñando una plataforma "básica" pero que incluye varias clases (ejemplo: usuarios, tareas, trabajos). Lo que sucede es que en una acción de un usuario, pongamosle "Dar por terminada una tarea", se hace uso de varias clases y se interactúa con varias tablas. El problema que actualmente tengo es que al interactuar con varias tablas, si algun insert o update falla, el resto que ya fueron ejecutados no vuelve para tras (es por esto que quiero las transacciones).

No se como hacer para agrupar todas esas transacciones de las diferentes clases en una sola transacción, para que si falla una el resto vuelva para atras...

Se que no es algo facil de explicar.. pero si aunque sea alguno conoce alguna aplicación básica open source que yo pueda revisar y tomar de ejemplo se los agradecería!

Desde ya muchas gracias !!!
 
Si usas la misma conexión en todas las clases simplemente mete todas las llamadas a las operaciones dentro de un try y en el catch pon el rollback. Algo como:
PHP:
<?php
$conn->beginTransaction();

try {
    // operaciones
    $conn->commit();
} catch (Exception $e) {
    $conn->rollback();
}

y en las operaciones si algo falla tira un Exception.
 
Pero da algún detalle más.
Qué versión de BD, PHP, framework estas usando?, hasta qué versión de JQuery tambien.
Entiendo que si fuera una transaccion de varias operaciones de una misma clase que esta usando la misma conexion a la BD, no tendrías problema, pero mejor sería que pongas una descripción más detallada de tu estructura de sistema.
 
Si, disculpen si no fui claro. Estoy diseñando una plataforma "básica" pero que incluye varias clases (ejemplo: usuarios, tareas, trabajos). Lo que sucede es que en una acción de un usuario, pongamosle "Dar por terminada una tarea", se hace uso de varias clases y se interactúa con varias tablas. El problema que actualmente tengo es que al interactuar con varias tablas, si algun insert o update falla, el resto que ya fueron ejecutados no vuelve para tras (es por esto que quiero las transacciones).

No se como hacer para agrupar todas esas transacciones de las diferentes clases en una sola transacción, para que si falla una el resto vuelva para atras...

Se que no es algo facil de explicar.. pero si aunque sea alguno conoce alguna aplicación básica open source que yo pueda revisar y tomar de ejemplo se los agradecería!

Desde ya muchas gracias !!!
Lo que te he puesto serviría para eso
 
Atrás
Arriba