Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo corretto di php mysqli autocommit e rollback

Lo usi quando hai una serie di istruzioni sql che devono essere eseguite insieme per mantenere la coerenza nel tuo database. Pensa a chiamare commit come a stabilire un punto di salvataggio in un gioco. Ogni volta che chiami rollback annulli tutto ciò che è stato fatto fino al commit precedente.

Immagina una situazione in cui devi salvare una fattura nella tabella delle fatture, i dettagli nella tabella fattura_dettagli e i pagamenti nella tabella dei pagamenti. Per mantenere la coerenza è necessario assicurarsi che siano stati tutti eseguiti o che nessuno di essi sia stato eseguito. Se dovessi aggiungere la fattura e i dettagli e poi si è verificato un errore nell'inserimento del pagamento, il tuo database viene lasciato in uno stato incoerente.

Normalmente ciò si ottiene utilizzando un blocco try/catch come questo:

try {
    $dbconnect->autocommit(false);

    $stmt = $dbconnect->prepare("INSERT INTO `invoices`(`col1`,`col2`) VALUES (?,?)");
    $stmt->bind_param('ss',$val1,$val2);
    $stmt->execute();

    $stmt = $dbconnect->prepare("INSERT INTO `invoice_details`(`col1`,`col2`) VALUES (?,?)");
    $stmt->bind_param('ss',$val3,$val4);
    $stmt->execute();

    $stmt = $dbconnect->prepare("INSERT INTO `payments`(`col1`,`col2`) VALUES (?,?)");
    $stmt->bind_param('ss',$val5,$val6);
    $stmt->execute();

    $dbconnect->commit();
} catch(Exception $e){
    // undo everything that was done in the try block in the case of a failure.
    $dbconnect->rollback();

    // throw another exception to inform the caller that the insert group failed.
    throw new StorageException("I couldn't save the invoice");
}