Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/04/2013, 18:25
Avatar de catpaw
catpaw
 
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
Puntos: 23
mejorar/optimizar transaccion

hola

Hice la busqueda correspondiente al foro sobre el tema de transaccione, encontre mucha informacion que me ha sesrvido para aclararme en este tema, ya solo me gustaria su punto de vista, este es un ejemplo de una trasaccion que implementare:

Código PHP:
Ver original
  1. $con_db = conecta_db();
  2. mysql_query("SET AUTOCOMMIT=0;");
  3. mysql_query("BEGIN;");
  4. mysql_query("DELETE FROM uno");
  5. mysql_query("LOAD DATA LOCAL INFILE 'prueba.txt' INTO TABLE uno FIELDS TERMINATED BY '|'");
  6. mysql_query("DELETE FROM dos");
  7. $query = mysql_query("SELECT * FROM uno ");
  8. $i=1;
  9. $retval = 0;
  10. while($registro = mysql_fetch_array($query)){
  11.     echo $registro['clave']." - ".$registro['nombre']."<br />";
  12.     //insert tabla2
  13.     $insercion1 = mysql_query("INSERT INTO dos (clave, calle, colonia) VALUES ('$i', '$i', '$i');");
  14.     if($insercion1){ //si hubo afectaciones
  15.         $retval = 1;
  16.     }
  17.     $i++;
  18. }
  19. if($retval==0){
  20.     echo 'MAL no insercion table dos: SE EJECUTA EL ROLLBACK<br />';
  21.     mysql_query("ROLLBACK");
  22. } else{
  23.     //select into de tabla2 for update
  24.     $resultado = mysql_query("SELECT * INTO OUTFILE 'C:/wamp/www/transaccion/prueba2.txt' FIELDS TERMINATED BY '' LINES TERMINATED BY '\\n' FROM dos FOR UPDATE");
  25.     if($resultado){
  26.         echo 'OK: SE EJECUTA EL COMMIT<br />';
  27.         mysql_query("COMMIT");
  28.     }
  29.     else{
  30.         echo 'MAL: SE EJECUTA EL ROLLBACK<br />';
  31.         mysql_query("ROLLBACK");
  32.     }
  33. }
  34. $con_db = desconecta_db($con_db);

Aclaro que lei sobre el uso de mysqli y del cual estoy conciente que debo ir reemplazando poco a poco en mis sistemas.

Tambien quise implementar el try/catch pero como mysql/mysqli no tiene aun soporte para excepciones (corrijanme si estoy mal) decide dejar las validaciones con if/else

Es importante mencionar que ocupo select for update porque la intencion de este sistemita es que se realice un proceso que ocupara dos tablas de paso las cuales deben estar inaccesibles para leer/escribir mientras el usuario este haciendo el proceso.

el archivo prueba.txt contiene:

Código:
1|dexter|
2|ronaldo|
3|lucrecia|
4|rusky|
5|jordana|
y la salida (prueba2.txt):

Código:
1          1                1
2          2                2
3          3                3
4          4                4
5          5                5

lo cual es correcto

bueno les agradezco de antemano