Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Istruzioni commit trans e rollback trans?

    Buon giorno a tutti.
    Vorrei capire bene come funzionano le istruzioni Commit transaction e Rollback transaction.
    La prima istruzione serve per rendere permanenti tutte le modifiche apportate al db.
    La seconda per tornare indietro in caso si verifichi un problema.
    Ora gli script che posto di seguito li ho trovati in rete, ma non so, come implementarli:
    Codice PHP:
    include '../connection/connect.php';

    function 
    cCommit_Trans($Conn=''$Err='') {
                    Global 
    $b_Trans;
                    
    $Err_Funz="";
                    if (
    $b_Trans==1) {
                        if (
    $Conn==''$Err_Funz mysql_query("COMMIT");
                        else 
    $Err_Funz mysql_query("COMMIT"$Conn);
                    }
                    if (
    $Err_Funz != ""$Err .= "Error in Commit Transaction instruction:
    "
    .$Err_Funz;
                    else 
    $Err '';
                    if (
    $Err == ""$b_Trans 0//Transazione dati terminata con Commit
                    
    else { print $Err."
    Attenzione: Annotare i messaggi di errore e contattare l'amministratore del sistema!"
    ; exit; }
                    return 
    $Err;
                }
                function 
    cRollback_Trans($Conn=''$Err='') {
                    Global 
    $b_Trans;
                    
    $Err_Funz="";
                    if (
    $b_Trans==1) {
                        if (
    $Conn==''$Err_Funz mysql_query("ROLLBACK");
                        else 
    $Err_Funz mysql_query("ROLLBACK"$Conn);
                    }
                    if (
    $Err_Funz != ""$Err .= "Error in Rollback Transaction instruction:
    "
    .$Err_Funz;
                    else 
    $Err '';
                    if (
    $Err == ""$b_Trans 0//Transazione dati terminata con Rollback
                    
    else { print $Err."
    Attenzione: Annotare i messaggi di errore e contattare l'amministratore del sistema!"
    ; exit; }
                    return 
    $Err;
                }

    if(!
    $connessione)
                {
                    echo 
    "impossibile stabilire una connessione\n
    "
    ;
                } else {
    $sqlUpd "UPDATE ".trim($DB).".webcal_user_new SET 
                            cal_mail_utenze_inviate=1
                            WHERE id_user = "
    .$_SESSION['id_user']."";
                            
    //echo $sqlUpd."
    \n";
                            
    $rsUpd= mysql_query($sqlUpd) or die ("Impossibile eseguire l'Update!" . mysql_error());
                } 
    Potete aiutarmi per favore?
    PS: forse manca una Begin transaction a quelle sopra riportate?
    Grazie mille...

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Hai necessità di scriverle tu per un motivo particolare? Non puoi lasicare che sia PHP a gestire le transazioni da solo?

  3. #3
    Codice PHP:


    mysql_connect
    (...);
    mysql_select_db(...);

    ...

    //inserisco valori nella tabella

    try{

    mysql_query('BEGIN');

    mysql_query('insert into pippo values(pluto)'); //questa query va a buon fine
    mysql_query('insert into tabella values(valori_sbagliati)'); //questa query darà errore
    mysql_query("COMMIT");

    }catch(
    Exception $ex){

    mysql_query("ROLLBACK"); //tutte le modifiche apportate al database da quando ho iniziato la transazione (begin) vengono annullate: ad esempio il nuovo record della tabella pippo 

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Originariamente inviato da Alhazred
    Hai necessità di scriverle tu per un motivo particolare? Non puoi lasicare che sia PHP a gestire le transazioni da solo?
    Grazie dell'interesse.
    Ma perchè se io eseguo una normale operazione di:
    1) connessione al DB
    2) update,insert o delete
    3) e poi chiudo la connessione al DB

    se ho un problema, lo gestisce in automatico PHP?
    Non ho bisogno di quelle istruzioni?

  5. #5
    Originariamente inviato da Santino83_02
    Codice PHP:
    mysql_connect(...);
    mysql_select_db(...);
    ...
    //inserisco valori nella tabella
    try{
    mysql_query('BEGIN');
    mysql_query('insert into pippo values(pluto)'); //questa query va a buon fine
    mysql_query('insert into tabella values(valori_sbagliati)'); //questa query darà errore
    mysql_query("COMMIT");
    }catch(
    Exception $ex){
    mysql_query("ROLLBACK"); //tutte le modifiche apportate al database da quando ho iniziato la transazione (begin) vengono annullate: ad esempio il nuovo record della tabella pippo 

    Grazie anche a te
    Tu generalmente gestisci questo tipo di transazioni in questo modo?

  6. #6
    Originariamente inviato da ANTAGONIA
    Grazie anche a te
    Tu generalmente gestisci questo tipo di transazioni in questo modo?
    Parliamo chiaramente: se l'operazione che stai facendo, in caso di errori o check falliti, non lascia il database inconsistente, allora eseguire la query all'interno di una transazione non ha molto senso, se non quello di appesantire tutto il procedimento.

    Comunque si generalmente quello è un esempio di come si fa una transazione, il codice che hai postato te ad occhio e croce è di molti anni e di molte versioni di php fa (per lo stile con qui è impostato) (e ora che lo riguardo, è un codice che fa veramente pena)

    e ovviamente no non le gestisco in questo modo perché generalmente lavoro in un'applicazione più object oriented e quindi non solo non uso le api di mysql direttamente ma piuttosto pdo, ma sviluppo il discorso seguendo altri paradigmi... il mio esempio era semplicemente per dire:

    BEGIN;
    Query
    Query
    Query
    COMMIT;
    if error then ROLLBACK;

    questa è una transazione
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    ciao ti ringrazio della schiettezza del "fa pena"...quindi dato che siamo in un forum e siamo qui tutti per migliorare, ti chiedo gentilmente di farmi un esempio di come gestisci la connessione al DB e di come esegui i vari comandi SQL.
    Codice PHP:
    if(!$connessione
                { 
                    echo 
    "impossibile stabilire una connessione\n
    "

                } else { 
    $sqlUpd "UPDATE ".trim($DB).".webcal_user_new SET  
                            cal_mail_utenze_inviate=1 
                            WHERE id_user = "
    .$_SESSION['id_user'].""
                            
    $rsUpdmysql_query($sqlUpd) or die ("Impossibile eseguire l'Update!" mysql_error()); 
                } 
    Te come fai generalmente?
    Ci sono tutorial sui quali basarmi cosi da "svecchiare" lo stile qui proposto?
    Grazie mille

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Se devi eseguire una sola query, usare una transazione non ha senso, se funziona tutto ok, se c'è un problema non viene eseguita.

    Le transazioni hanno senso se hai più query in sequenza.
    Esempio un po' rozzo, ma rende l'idea:
    hai un sito ecommerce, un utente acquista un articolo, quindi dovrai
    query1 -> insert del prodotto con associato l'acquirente e vari altri dati in una tabella "ordini"
    query2 -> decrementare la quantità disponibile del prodotto
    ...
    magari qualche altra cosa, ma va bene già così

    Se una delle due fallisce e non fai niente avrai un problema sul db:
    - un ordine senza aver decremento di prodotto disponibile (quindi agli altri utenti risulterà che ne hai più della quantità reale)
    - avrai un ordine non inserito e comunque una quantità di prodotto inferiore a quella reale mostrata agli utenti (come se l'avessi venduto).

    La transazione invece ti assicura la coerenza dei dati sul db.
    Il primo post di Santino83_02 ti dice come usare le transazioni:
    Codice PHP:
    try {
        
    mysql_query('BEGIN');
        
    mysql_query(...);
        
    mysql_query(...);
       
    //tutte le altre query che vuoi
        
    mysql_query("COMMIT"); //se arrivi qui vuol dire che è andato tutto bene e le query saranno definitive
    } catch(Exception $ex) { //se una delle query fallisce vai qui dentro
        
    mysql_query("ROLLBACK"); //query annullate e db come era prima dell'inizio della transazione

    Ricorda che per far funzionare le transazioni devi specificare per le tabelle un engine InnoDB, MyISAM non le supporta.

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.