Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 25 su 25

Discussione: [PHP] transazioni

  1. #21
    Utente di HTML.it L'avatar di iox84
    Registrato dal
    May 2004
    Messaggi
    754
    Sei sicuro che stai utilizzando delle tabelle che supportano le trasanzioni (ad esempio le innodb)?

    Comunque in ogni caso ti conviene mettere tutti i valori restituiti dalle query in un vettore (anziche tutti nella variabile $risultato) e controllare alla fine se tutti i valori sono a true (in questo caso devi committare), altrimenti devi eseguire un rollback
    La fortuna e' cieca ma la sfiga ci vede benissimo
    Comprarselo o farselo di legno

  2. #22

    innodb!!!

    a dire il vero non so bene cosa è innodb! io utilizzo mysql! e poi come metto il risultato in un vettore?

    perdonami ma sono agli inizi con il php!

    Ciao


  3. #23
    Utente di HTML.it L'avatar di iox84
    Registrato dal
    May 2004
    Messaggi
    754
    In mysql ci sono vari tipi di tabelle, quelle di default sono le myisam e non supportano le transazioni, chiavi esterne e company, quindi quando crei le tabelle devi utilizzare la seguente sintassi sql:
    codice:
    CREATE TABLE esempio(
    ...definizione dei campi
    )TYPE=INNODB
    In questa maniera verrà creata una tabella di tipo innodb che sono piu' pesanti delle myisam ma hanno delle funzionalita' in piu'.

    per il codice ti faccio un'esempio:
    codice:
    <?PHP 
         $commit = true; //variabile che mi indica se committare o meno     
        $connessione = mysql_connect ("localhost", "root", "") or die ("Il database non può essere connesso ");
         mysql_select_db("luketto", $connessione) or die ("Il database non può essere selezionato ");
                                         
        mysql_query("SET AUTOCOMMIT = 0") or die("L autocommit non può essere impostato " . mysql_error());
        
        mysql_query("START TRANSACTION");
        
        $query = "INSERT INTO utenti (username) VALUES ('AAA')";
        $risultato[0] = mysql_query($query, $connessione);
        
        $query = "INSERT INTO utenti (username) VALUES ('BBB')";
        $risultato[1] = mysql_query($query, $connessione);
        
        $query = "INSERT INTO utenti (username) VALUES ('CCC')";
        $risultato[2] = mysql_query($query, $connessione);
        
        for($i = 0; $i < sizeof($risultato); $i++){
          if(!$risultato[$i]){
             $commit = false;
          }
        }
        if($commit){    
            mysql_query("COMMIT");
        }else{
            mysql_query("ROLLBACK");
        }
    ?>
    Con questo codice (l'ho scritto in fretta, ci saranno sicuramente soluzioni migliori) se tutte le query vanno a buon fine viene committato il tutto, altrimenti viene eseguito il ROLLBACK.
    Ribadisco il concetto che le tabelle devono essere di tipo innodb
    La fortuna e' cieca ma la sfiga ci vede benissimo
    Comprarselo o farselo di legno

  4. #24
    Una piccola correzione.

    Quel SET AUTOCOMMIT = 0 prima della transazione, che avete scritto in diversi, non serve a niente.

    Cito dal manuale:
    If you want to disable autocommit mode for a single series of statements, you can use the START TRANSACTION statement:

    START TRANSACTION;
    SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
    UPDATE table2 SET summary=@A WHERE type=1;
    COMMIT;

    With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state.

  5. #25

    grazie

    Volevo ringraziare tutti per l'aiuto!
    Sono riuscito finalmente a creare la transazione e volevo confermare l'unitilità dell'istruzione SET AUTOCOMMIT = 0

    Grazie mille
    Luketto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.