Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Transaccion con 2 bases de datos

Estas en el tema de Transaccion con 2 bases de datos en el foro de Mysql en Foros del Web. Perdón, Transacci ó n Buenas amigos, Les expongo mi caso haber si me pueden ayudar. Tengo la base de datos I con la tabla J ...
  #1 (permalink)  
Antiguo 12/01/2010, 11:16
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Transaccion con 2 bases de datos

Perdón, Transacción
Buenas amigos,

Les expongo mi caso haber si me pueden ayudar.

Tengo la base de datos I con la tabla J. Digamos que ésta es la principal
Luego tengo una base de datos X con la tabla Y. Digamos que ésta sería, por decirlo de alguna forma, auxiliar de I ya que en ésta almaceno archivos asociados a registros de la base de datos I

es decir:
- cada registro de la tabla I.J tiene asociado uno en la tabla X.Y que contiene el archivo asociado al registro de la tabla J

Lo hago así por esto de que el que manda manda aunque mande mal. El que manda se empeña en que tiene que estar asi para mantener la base de datos limpia,...

Son dos consultas por lo tanto para cubrir la posibilidad de que la segunda falle pense en hacer una transacción de la siguiente forma

Código PHP:
Ver original
  1. // conexion a Mysql por defecto la BD I
  2.  
  3.     $sql="SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED";
  4.     $consulta = mysql_query ($sql, $db);
  5.     if (!$consulta){
  6.       $sqlROLL = "ROLLBACK";
  7.       $consultaROLL = mysql_query ($sqlROLL, $db) or die (mysql_error($db));
  8.       exit();
  9.     }
  10.  
  11.     $sql = "BEGIN";
  12.     $consulta = mysql_query ($sql, $db);
  13.     if (!$consulta){
  14.       $sqlROLL = "ROLLBACK";
  15.       $consultaROLL = mysql_query ($sqlROLL, $db) or die (mysql_error($db));
  16.       exit();
  17.     }
  18. // Cambio a la base de datos X para insertar archivo
  19.     $status = mysql_select_db('X');
  20.     if (!$status){
  21.       $sqlROLL = "ROLLBACK";
  22.       $consultaROLL = mysql_query ($sqlROLL, $db) or die (mysql_error($db));
  23.       exit();
  24.     }
  25.  
  26.     // inserto el archivo
  27.     $sql = "INSERT INTO Y (...) VALUES (...)";
  28.     $consulta = mysql_query ($sql , $db);
  29.     if (!$consulta){
  30.  
  31.       $sqlROLL = "ROLLBACK";
  32.       $consultaROLL = mysql_query ($sqlROLL, $db) or die (mysql_error($db));
  33.       exit();
  34.     }
  35.     // Extraigo el id insertado
  36.     $keyCarta = mysql_insert_id($db);
  37.  
  38. // Cambio a la base de datos I para insertar registro y asociarle el archivo previamente insertado
  39.     $status = mysql_select_db('I');
  40.     if (!$status){
  41.       $sqlROLL = "ROLLBACK";
  42.       $consultaROLL = mysql_query ($sqlROLL, $db) or die (mysql_error($db));
  43.       exit();
  44.     }
  45.  
  46.     //Inserto registro y asocio archivo por medio del campo 'rel_y'
  47.     $sql = "INSERT INTO J (...,rel_y) VALUES (...,'$key')";
  48.     $consulta = mysql_query ($sql , $db);
  49.     if (!$consulta){
  50.       $sqlROLL = "ROLLBACK";
  51.       $consultaROLL = mysql_query ($sqlROLL, $db) or die (mysql_error($db));
  52.       exit();
  53.     }

Me da la sensación de que al hacer el cambio de base de datos pierdo la transacción. He hecho pruebas y fallando la segunda consulta de inserción me mantiene los cambios hechos en la primera

Gracias de antemano y espero me puedan ayudar pues soy novatillo en esto
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #2 (permalink)  
Antiguo 12/01/2010, 11:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Transaccion con 2 bases de datos

Cita:
Me da la sensación de que al hacer el cambio de base de datos pierdo la transacción. He hecho pruebas y fallando la segunda consulta de inserción me mantiene los cambios hechos en la primera
En primer lugar, no nos estás aclarando los tipos de tablas que usas. Eso es importante por cuanto las MyISAM no las soportan.
Por otro lado, el comando de inicio de una transacción no es BEGIN, sino START TRANSACTION (ver 13.4.1. Sintaxis de START TRANSACTION, COMMIT y ROLLBACK)
Además, el problema no es que pierdas la transacción. Si se perdiese esa transacción debería generarse un ROLLBACK implícito, por lo que la primera no almacenaría nada, y sí lo hace. Ergo, el ciclo funciona parcialmente. Lo que puede suceder es que el segundo rollback debe también cambiar de base y realizar su rollback respectivo.
¿Lo estás haciendo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 13/01/2010, 03:16
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Transaccion con 2 bases de datos

Gracias gnzsoloyo por contestar.

En primer lugar el tipo de tablas es innoDB.

En cuanto a la sentencia de comienzo de transacción OK, gracias por la referencia, siempre habia usado el alias BEGIN y no habia tenido problemas. En cualquier caso lo he probado y tamppoco y no creo que el problema este aquí ya que haciendo pruebas sin cambio de base de datos la transancción funcionó correctamente.

Más bien creo que el tema este en la última parte de tu contestación

Cita:
Lo que puede suceder es que el segundo rollback debe también cambiar de base y realizar su rollback respectivo.
¿Lo estás haciendo?
No entiendo muy bien. El segundo rolback es el del BEGIN ahora START TRANSACTION, te refieres a cambiar primero de BD y después comenzar la transacción, Agradecería si me pudieras poner un ejemplo.

Gracias de Antemano.
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!

Etiquetas: bases, transacciones
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 01:40.