Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    483

    Transazioni - auto commite

    Ciao a tutti.. vi spiego subito il mio problema...

    Ho realizzato uno script che fa uso delle transazioni mysql... Soltanto che ho notato che se dall'apertura della transazioni fino alla chiusura vengono eseguite tante query.. viene eseguito il commite automaticamente...


    Mi spiego meglio con un esempio

    1) apro la transazione
    2) eseguo un bel po' di query e se solo una di queste va male interrompo la transazione eseguendo un roolback
    3) eseguo il commite se è andato tutto bene...


    E in effetti funziona xke tutte le query vengono confermate perchè non vi sono errori.. Per sfizio ho pero' provato a far eseguire alla fine invece del commite il roolback (quindi anke se è andato tutto ok annullo tutto)... ma le query vengono lo stesso confermate (ma io il commite non lo faccio mica).. come se ad un certo punto..quando sono troppe le query eseguite all'interno della transazione.. venga eseguito automaticamente un auto-commite...


    Qualkuno sa aiutarmi ? sapete spiegarmi xke avviene questo ? ?


    grazie millle

  2. #2
    ovviamente usi tabelle InnoDB ... giusto?

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    483
    si si.. infatti una semplice prova

    > apro transazione

    > eseguo un paio di query

    > le annullo con un roolback

    funziona tutto...

    se invece quel paio diventano tante... non va piu'... se ti puo' essere di aiuto x capire io apro 2 transazioni.. perchè devo lavorare contemporaneamente su 2 database.. uno locale e uno in internet.... e su quello in internet le modifiche non vengono confermate..su quello locale si

  4. #4
    uno script php quando apre una connessione su un database abbandona l'altra.

    non credo tu possa fare questo, cioe' aggiornare due database contemporaneamente e poi eseguire un commit o rollback su entrambi a seconda di come sono andate le cose. prova a settare autocommit = 0

    set autocommit = 0

    Ci sono dei tools (non free, almeno credo) che si occupano di sincronizzare due database su server diversi.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    483
    Con l'auto commite = 0 ho già provato... e cmq io apro due connessioni distinte e poi a ogni query che devo eseguire gli passo l'identificativo della connessione per capire se la query deve essere eseguita online o in locale..... e la cosa funziona... xke se eseguo semplicemente una cosa del tipo

    > apro connessione internet
    > apro connessione locale

    > prendo dei dati da locale e li sparo online
    > prendo dei dati da internet e li sparo in locale

    > se tutto ok eseguo il commite di entrambi

    funziona tranquillamente... è questo ke non mi spiego... appena aumenta la mole dei dati non va piu'...


    se ti puo' essere di aiuto questo è quello che funziona (cioè che i dati non vengono confermati finche non do il commite... quelli che non funzionano sono identici salvo ke le query sono un pokino di piu')


    Codice PHP:

        
    try
        {
            
    $LOCALE_start mysql_query("START TRANSACTION"$cn_locale);
            if (!
    $LOCALE_start) throw new Exception("Errore apertura transazione locale: ".mysql_error($cn_locale));   
            
            
    $INTERNET_start mysql_query("START TRANSACTION"$cn_internet);
            if (!
    $INTERNET_start) throw new Exception("Errore apertura transazione internet: ".mysql_error($cn_internet));   
        
            
            
    $LOCALE_sql_1 "SELECT * FROM ...";
            
    $LOCALE_query_1 mysql_query($LOCALE_sql_1$cn_locale);
            if (!
    $LOCALE_query_1) throw new Exception("Errore LOCALE_query_1 ".mysql_error($cn_locale));    
            
    $LOCALE_num_1 mysql_num_rows($LOCALE_query_1);
            if (
    $LOCALE_num_1 0)
            {
                
    $i 0;
                while (
    $LOCALE_dati_1 mysql_fetch_array($LOCALE_query_1MYSQL_ASSOC))
                {
                    
                    
    $INTERNET_sql_1 "SELECT ...";
                    
    $INTERNET_query_1 mysql_query($INTERNET_sql_1$cn_internet);
                    if (!
    $INTERNET_query_1) throw new Exception("Errore INTERNET_query_1 ".mysql_error($cn_internet));    
                    
    $INTERNET_num_1 mysql_num_rows($INTERNET_query_1);
                    if (
    $INTERNET_num_1 0)
                    {
                        
    $INTERNET_sql_2 "UPDATE ...";
                    }
    //end if $INTERNET_num_1 > 0
                    
    else
                    {
                        
    $INTERNET_sql_2 "INSERT INTO ...";
                    }
    //end else $INTERNET_num_1 > 0
                    
    $INTERNET_query_2 mysql_query($INTERNET_sql_2$cn_internet);
                    if (!
    $INTERNET_query_2) throw new Exception("Errore INTERNET_query_2 ".mysql_error($cn_internet));    
                    else 
    $i++;
                }
    //end while
                
    if ($i != $LOCALE_num_1 ) throw new Exception("Errore contatore while su LOCALE_query_1"); 
            }
    //end $LOCALE_num_1 > 0    
            
            //LIBERO LA MEMORIA
            
    mysql_free_result($LOCALE_query_1);
            
            
            
    $LOCALE_sql_2 "TRUNCATE TABLE ...";
            
    $LOCALE_query_2 mysql_query($LOCALE_sql_2$cn_locale);
            if (!
    $LOCALE_query_2) throw new Exception("Errore LOCALE_query_2 ".mysql_error($cn_locale));    
            
            
            
    $INTERNET_sql_3 "SELECT * ...";
            
    $INTERNET_query_3 mysql_query($INTERNET_sql_3$cn_internet);
            if (!
    $INTERNET_query_3) throw new Exception("Errore INTERNET_query_3 ".mysql_error($cn_internet));    
            
    $INTERNET_num_3 mysql_num_rows($INTERNET_query_3);
            if (
    $INTERNET_num_3 0)
            {
                
    $i 0;
                while (
    $INTERNET_dati_3 mysql_fetch_array($INTERNET_query_3MYSQL_ASSOC))
                {
                    
    $LOCALE_sql_3 "INSERT INTO ...";
                    
    $LOCALE_query_3 mysql_query($LOCALE_sql_3$cn_locale);
                    if (!
    $LOCALE_query_3) throw new Exception("Errore LOCALE_query_3 ".mysql_error($cn_locale));    
                    else 
    $i++;            
                }
    //end while
                
    if ($i != $INTERNET_num_3) throw new Exception("Errore contatore while su INTERNET_query_3"); 
            }
    //end $INTERNET_num_3 > 0
        
            //LIBERO LA MEMORIA
            
    mysql_free_result($INTERNET_query_3);
            
            
    //CONFERMO LE OPERAZIONI 
            
    $LOCALE_end mysql_query("COMMIT"$cn_locale);
            if (!
    $LOCALE_end) throw new Exception("Errore chiusura transazione locale: ".mysql_error($cn_locale));
               
            
    $INTERNET_end mysql_query("COMMIT"$cn_internet);
            if (!
    $INTERNET_end) throw new Exception("Errore chiusura transazione internet: ".mysql_error($cn_internet));    
            
            
    $RESULT true;    
        }
    //end try
        
    catch (Exception $e)
        {
            
    $RESULT false;
            
    $LOCALE_end mysql_query("ROLLBACK"$cn_locale);
            
    $INTERNET_end mysql_query("ROLLBACK"$cn_internet);
            echo 
    $e;
        } 

  6. #6
    azz... ti ringrazio per la fiducia ma purtroppo non ho tempo per leggere/capire il tuo script.... anche perche' non so che dovrebbe fare il tuo progetto.....

    non ho mai provato e nemmeno ci provero' ad eseguire query in contemporanea su due server diversi... son troppe le volte che va buca ad uno dei due vuoi per time out del php o di mysql, linea adsl, il server ISP, vuoi per altre cose... con tutte le eccezioni del caso da gestire ....

    per esempio il fatto di non funzionare aumentando il carico con parecchie query potrebbe benissimo rientrare nella casistica detta sopra.

    Ci sono degli strumenti (per es.: SQLyog Enterprise Database Synchronization) che provvedono a sincronizzare due database tramite lo scheduler e quindi senza intervento manuale.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    483
    ok ti ringrazio


    provero' a guardare questi strumenti


    ciao

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.