Foros del Web » Programando para Internet » PHP »

Transacciones utilizando 2 DB

Estas en el tema de Transacciones utilizando 2 DB en el foro de PHP en Foros del Web. Señores: Recurro a ustedes despues de partirme la cabeza durante horas sin encontrar solución. Este es mi problema: Necesito hacer un insert en una base ...
  #1 (permalink)  
Antiguo 27/06/2006, 23:21
 
Fecha de Ingreso: abril-2004
Mensajes: 154
Antigüedad: 20 años, 7 meses
Puntos: 0
Busqueda Transacciones utilizando 2 DB

Señores:
Recurro a ustedes despues de partirme la cabeza durante horas sin encontrar solución. Este es mi problema:

Necesito hacer un insert en una base de datos; si fué exitoso, necesito hacer otro insert en otra base de datos, por lo cual deberia utilizar transacciones, pero no me funciona. Adjunto la manera en que lo estoy haciendo:

Código PHP:
//-------------------------------------------------------------------------
// me conecto a la db1
$db_link1 mysql_connect("localhost","root","");
mysql_select_db("db_1",$dbl_link1);

// ahora me conecto a la db2
$db_link2 mysql_connect("localhost","root","");
mysql_select_db("db_2",$db_link2);

// ahora hago el query en la db_1 poniéndolo dentro de una transaccion, y la //cierro cuando tambien haya hecho el query del db2


// query db_1
mysql_query("BEGIN",$db_link1);
mysql_query("INSERT INTO clientes (nombre,apellido) VALUES ('Fulano','Jaramillo')",$db_link1);


//ahora hago el query para el db_2 dentro de su respectiva transacción
mysql_query("BEGIN",$db_link2);
$x mysql_query("INSERT INTO clientes (nombre,apellido) VALUES ('Fulano','Jaramillo')",$db_link2);

// si ocurre un error en el query, paro el script osea que no se hace el commit,  
// por lo tanto no se puede hacer ni el query 1 ni el dos
if(!x){
 exit();
}

mysql_query("COMMIT",$db_link1);
mysql_query("COMMIT",$db_link2);
//------------------------------------------------------------------------- 
Cuando pongo algun error de sintaxis en el query dos, se supone que el query uno no se realiza --> PERO SI SE ESTÁ REALIZANDO¡¡¡¡¡¡

NECESITO LA AYUDA DE TODOS PARA RESOLVER ESTE PROBLEMA.
Este tipo de script puede ser util para mucha gente

Mil gracias
__________________
Desdichado quien duerme en la mañana
  #2 (permalink)  
Antiguo 28/06/2006, 00:52
Avatar de DaHousecat  
Fecha de Ingreso: junio-2006
Mensajes: 132
Antigüedad: 18 años, 5 meses
Puntos: 1
Código PHP:
Prueba asi:

//-------------------------------------------------------------------------
// me conecto a la db1
$db_link1 mysql_connect("localhost","root","");
mysql_select_db("db_1",$dbl_link1);

// ahora hago el query en la db_1 poniéndolo dentro de una transaccion, y la //cierro cuando tambien haya hecho el query del db2


// query db_1
mysql_query("BEGIN",$db_link1);
if(
mysql_query("INSERT INTO clientes (nombre,apellido) VALUES ('Fulano','Jaramillo')",$db_link1)){
// ahora me conecto a la db2
$db_link2 mysql_connect("localhost","root","");
mysql_select_db("db_2",$db_link2);
//ahora hago el query para el db_2 dentro de su respectiva transacción
mysql_query("BEGIN",$db_link2);
$x mysql_query("INSERT INTO clientes (nombre,apellido) VALUES ('Fulano','Jaramillo')",$db_link2);
}
// si ocurre un error en el query, paro el script osea que no se hace el commit,  
// por lo tanto no se puede hacer ni el query 1 ni el dos
if(!x){
 exit();
}

mysql_query("COMMIT",$db_link1);
mysql_query("COMMIT",$db_link2);
//------------------------------------------------------------------------- 
__________________
DaHouseCat's Blog || Un blog de Flash ActionScript, PHP, MySQL, Motorola Modding y mucho más ^_^
  #3 (permalink)  
Antiguo 28/06/2006, 08:40
 
Fecha de Ingreso: abril-2004
Mensajes: 154
Antigüedad: 20 años, 7 meses
Puntos: 0
Sigue sin funcionar....
__________________
Desdichado quien duerme en la mañana
  #4 (permalink)  
Antiguo 28/06/2006, 08:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Amigo, en las transacciones explicitamente tienes que usar ROLLBACK, para deshacer los cambios, si no la base de datos piensa que todo fue exitoso (a menos que haya un error), y hace el commit, prueba lo que sigue:
Código PHP:
//-------------------------------------------------------------------------
// me conecto a la db1
$db_link1 mysql_connect("localhost","root","");
mysql_select_db("db_1",$dbl_link1);

// ahora me conecto a la db2
$db_link2 mysql_connect("localhost","root","");
mysql_select_db("db_2",$db_link2);

// ahora hago el query en la db_1 poniéndolo dentro de una transaccion, y la //cierro cuando tambien haya hecho el query del db2


// query db_1
mysql_query("BEGIN",$db_link1);
mysql_query("INSERT INTO clientes (nombre,apellido) VALUES ('Fulano','Jaramillo')",$db_link1);


//ahora hago el query para el db_2 dentro de su respectiva transacción
mysql_query("BEGIN",$db_link2);
$x mysql_query("INSERT INTO clientes (nombre,apellido) VALUES ('Fulano','Jaramillo')",$db_link2);

// si ocurre un error en el query, paro el script osea que no se hace el commit,  
// por lo tanto no se puede hacer ni el query 1 ni el dos
if(!x){
 
mysql_query"ROLLBACK"$db_link2 );
 exit();
}

mysql_query("COMMIT",$db_link1);
mysql_query("COMMIT",$db_link2);
//------------------------------------------------------------------------- 
  #5 (permalink)  
Antiguo 28/06/2006, 09:03
 
Fecha de Ingreso: abril-2004
Mensajes: 154
Antigüedad: 20 años, 7 meses
Puntos: 0
Gracias Gator pero tengo entendido que el commit no lo hace la base de datos sola, es decir, uno se lo tiene que dar, y si no lo doy (porque el !x me detuvo el script) entonces nada se realiza.
De todas maneras voy a intentar lo que me dices.
Gracias
__________________
Desdichado quien duerme en la mañana
  #6 (permalink)  
Antiguo 28/06/2006, 09:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
El problema es que MySQL por default tiene el flag the AUTO_COMMIT como 1, debes expresamente deshabilitarlo, mandando un query.

Código PHP:
mysql_query"SET AUTOCOMMIT=0"$db_link2 ); 
Para que entonces no haga los cambios, inmediatamente cuando se envia el query, te recomiendo le des una leida a esto:
http://www.onlamp.com/pub/a/php/2003...ls.html?page=2
  #7 (permalink)  
Antiguo 28/06/2006, 09:16
 
Fecha de Ingreso: abril-2004
Mensajes: 154
Antigüedad: 20 años, 7 meses
Puntos: 0
Muy interesante lo que me dices Gator, pero entonces en el momento de alojar mi proyecto, podría aplicar ese query de activación en el Mysql que me facilitan? recordando que no soy root. Voy a intentar lo que me dices.
Mil gracias
__________________
Desdichado quien duerme en la mañana
  #8 (permalink)  
Antiguo 28/06/2006, 09:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
En si, es al inicio de tu transaccion por decir:
- Pones AUTO_COMMIT a 0
- Mandas BEGIN
- Realizas tus Querys
- En el momento de un error, mandas ROLLBACK
- Finalizas tu Transaccion con COMMIT
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 12:08.