Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    [MySQL]: Verificare query prima di effettuarle

    Esiste la possibilitā di effettuare una verifica completa di una serie di query prima di effettuarle realmente?
    Ad esempio registro un nuovo cliente per il quale devo inserire diversi dati in diverse tabelle:

    ana_clienti
    ana_servizi
    ana_fatture
    ana_primanota

    mettiamo che ci sia un errore nella terza query per cui mi ritrovo che le prime 2 sono andate a buon fine (per cui i dati sono stati inseriti) mentre 3 e 4 sono saltate.

    In questo caso devo andare ad eliminare i dati nelle prime 2 tabelle prima di rieseguire tutte le operazioni.

    Sarebbe comodo prima verificare se tutte andrebbero a buon fine, cosė nel db non viene scritto nulla, e poi eventualmente eseguirle realmente.

    ciao
    grazie

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    pių semplicemente ancora se hai l'engine innodb ti basta una transazione (e il giusto livello ACID)

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Infatti utilizzo InnoDB e sono proprio le transazioni che cercavo. Ora un po' di studio e poi al via le prove.
    Grazie.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Dopo le prime prove, ecco giā le prime domande...
    Premesso che per quello che serve a me sembra che il codice sia molto semplice:

    START TRANSACTION;
    query varie;
    COMMIT o ROLLBACK in base al risultato;

    Questo potrebbe essere il codice:

    Codice PHP:
    // inizio la transazione
    mysql_query("START TRANSACTION");

    // eseguo la prima query
    $query "INSERT INTO tabella (campi) VALUES (valori)";
    $result mysql_query($query);

    // se non va a buon fine eseguo il rollback
    if(!$result) {
     
    mysql_query("ROLLBACK");
     exit;
    }

    // eseguo la seconda query
    $query "INSERT INTO tabella (campi) VALUES (valori)";
    $result mysql_query($query);

    // se non va a buon fine eseguo il rollback
    if(!$result) {
     
    mysql_query("ROLLBACK");
     exit;
    }

    // se sono arrivato fin qui posso fare il commit
     
    mysql_query("COMMIT"); 
    Oppure potrei sfruttare il die nell'operazione di query:

    Codice PHP:
    $result mysql_query($query) or die(mysql_query("ROLLBACK")); 
    Anche se quest'ultimo non credo funzioni in quanto il die mi restituisce solo a video il risultato. Di fatto non viene perō effettuato il commit in quanto esco.

    Le domande sono:

    1) Se interrompo l'esecuzione come visto nell'ultimo esempio sopra ovvero effettuo uno START TRANSACTION e poi non faccio nč ROLLBACK nč COMMIT ho visto che comunque non viene scritto nulla nel database. Ma in che stato rimane MySQL? L'operazione rimane in sospeso?
    2) ho notato che comunque se ho una chiave primaria autoincrementale, anche dopo il rollback non viene riportato il valore precedente ma continua la numerazione progressivamente. C'č anche la possibilitā di fare rimanere il contatore al posto precedente?

    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da aasmdaa
    1) Se interrompo l'esecuzione come visto nell'ultimo esempio sopra ovvero effettuo uno START TRANSACTION e poi non faccio nč ROLLBACK nč COMMIT ho visto che comunque non viene scritto nulla nel database. Ma in che stato rimane MySQL? L'operazione rimane in sospeso?
    La domanda č malposta.

    La sessione mysql, finquando non scade (tipicamente 8 ore, ma dipende da quanto č impostato) rimane in "attesa". Dopodichč viene "discardata".
    2) ho notato che comunque se ho una chiave primaria autoincrementale, anche dopo il rollback non viene riportato il valore precedente ma continua la numerazione progressivamente. C'č anche la possibilitā di fare rimanere il contatore al posto precedente?
    In breve?
    no (o meglio "no" in generale, ci sono 700 argomenti da approfondire sul funzionamenti di autoincrementi e transazioni)

    Il contatore č tenuto in memoria, per motivi di atomicitā, non su disco.
    E c'č solo la garanzia di monotonicitā crescente, null'altro.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Ok grazie tutto chiaro.

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.