Foros del Web » Programando para Internet » PHP »

Como usar transacciones Mysql?

Estas en el tema de Como usar transacciones Mysql? en el foro de PHP en Foros del Web. Como están? Tengo una duda en relación a las transacciones y utilizarlas en PHP, principalmente no se como hacerlo correctamente jaja. Les comento como para ...
  #1 (permalink)  
Antiguo 07/03/2014, 06:28
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 15 años, 6 meses
Puntos: 0
Como usar transacciones Mysql?

Como están?

Tengo una duda en relación a las transacciones y utilizarlas en PHP, principalmente no se como hacerlo correctamente jaja.

Les comento como para entrar en contexto.

Tengo una tabla ordenesdetrabajo, que por ejemplo contiene
Código:
id, idcliente, descripción, marca, modelo, precio
Luego tengo una tabla movimientos que contiene
Código:
idordendetrabajo, fechayhora, movimiento
movimiento tiene por default 1 que sería (orden aceptada)

y probablemente también deba actualizar otra tabla más que se relaciona con la orden de trabajo.

Que pasa, cuando un usuario carga una orden, debo cargar en ambas tablas datos que se relacionan perfectamente.

Es decir el movimiento asentado, debe contener el último ID que se ingreso en la tabla ordenes ya que el primer movimiento se carga automáticamente al crearse la orden. Luego los siguientes movimientos no hay problema porque se cargaran manualmente pero el primer movimiento se carga automático al cargarse la orden. Además de que en un primer momento no puedo saber que ID se le asignará a la orden.

en el Foro MySQL me indicaron que para este tipo de cargas debo utilizar Transacciones y para la inserción de movimientos utilizo LAST_INSERT_ID() y listo, de esta forma podre hacerlo sin peligro de que se carguen 2 movimientos a la misma orden. Si es que 2 usuarios están utilizando el sistema al mismo tiempo.

Bien acá viene mi duda Como se utilizan las transacciones en PHP? se como ejecutar una carga, y luego otra pero como anidarlas en una transacción.

indivicualmente haría lo siguiente
Código PHP:
$this->_con = new mysqli(DB_HOSTDB_USUARIODB_PASSWORDDB_DATABASE);
$sql 'INSERT INTO ordenesdetrabajo (idcliente, descripción, marca, modelo, precio) VALUES (?, ?, ?, ? ,?)';
$this->_stmt $this->_con->prepare($sql)
$this->_stmt->bind_param('isssd'$idcliente$descripcion$marca$modelo$precio);
$this->_stmt->execute(); 
y para movimientos
Código PHP:
$this->_con = new mysqli(DB_HOSTDB_USUARIODB_PASSWORDDB_DATABASE);
$sql 'INSERT INTO ordenesdetrabajo (idordendetrabajo, fechayhora) VALUES (last_insert_id(), now())';
$this->_con->query($sql)
$this->_con->close(); 
Como podría hacer correctamente esto con transacciones para evitar problemas si 2 estamos cargando una orden al mismo tiempo?

Desde ya muchas gracias a todos!
  #2 (permalink)  
Antiguo 07/03/2014, 07:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Como usar transacciones Mysql?

PHP no es quien maneja la transacción si no mysql

Manual


Des de php solo puedes lanzar querys al servidor, la primera seria

Código MySQL:
Ver original 

y la lanzarias igual que una query "normal" (select, insert, update....)

A partir de ahi el servidor ha iniciado una transacción, todas la querys que se lancen a continuación se consideraran como integrantes de la misma transacción hasta que se lance una de las siguientes querys

Código MySQL:
Ver original 

o

Código MySQL:
Ver original 

Lanzaras una u otra en función del resultado de las querys que hayas lanzado o de si se ha producido o no algún error en el proceso.

Solo podrás usar esto si immodb es el motor de tu base de datos.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 07/03/2014, 07:48
 
Fecha de Ingreso: enero-2008
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Como usar transacciones Mysql?

Cita:
Iniciado por quimfv Ver Mensaje
PHP no es quien maneja la transacción si no mysql
Según tengo entendido desde php5 se puede manejar desde php pero no me escuches mucho ya que hace tiempo no estoy en este mundillo jaja.

IMPORTANTE: Toma con pinzas lo que escribo ya que estoy muy fuera del tema y tal vez no es correcto lo que estoy planteando, pero por lo que he podido leer creo que debería ser algo similar a lo que planteo aquí abajo.

creo que debes desactivar el autocommit primero para que no te ejecute las query en el momento que las lanzas que sería algo así si seguimos el ejemplo que has planteado

Código PHP:
$this->_con->autocommit (false); 

luego ejecutas las query que tengas ya sean simples o no

Código PHP:
$_this->_con->query($sql);
$_this->_con->query($sql2);
$_this->_con->query($sql...);
$_this->_con->query($sqln); 
y luego las plasmas en la BD

Código PHP:
$_this->_con->commit(); 
No se si será igual con las sentencias preparadas, en el caso de que sea igual sería así el tema

Código PHP:
$this->_con->autocommit(false);

$this->_con = new mysqli(DB_HOSTDB_USUARIODB_PASSWORDDB_DATABASE); 
$sql 'INSERT INTO ordenesdetrabajo (idcliente, descripción, marca, modelo, precio) VALUES (?, ?, ?, ? ,?)'
$this->_stmt $this->_con->prepare($sql
$this->_stmt->bind_param('isssd'$idcliente$descripcion$marca$modelo$precio); 
$this->_stmt->execute(); 


//Aquí ejecutas el query que añade el movimiento
$this->_con->query($sql2);

$this->_con->commit(); 
Alguien con más experiencia debería darte una mano con el tema Rollback, la verdad no se me ocurre como aplicarlo y es importante Ya que en caso de algún error en medio de la transacción se anularian todos los cambios realizados.

Saludos

Etiquetas: mysql, sql, tabla, transacciones, usar, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:12.