U gebruikt het wanneer u een reeks sql-instructies hebt die samen moeten worden uitgevoerd om consistentie in uw database te behouden. Beschouw het aanroepen van commit als het vaststellen van een opslagpunt in een game. Elke keer dat je terugdraait, maak je alles ongedaan dat tot de vorige commit is gedaan.
Stelt u zich een situatie voor waarin u een factuur moet opslaan in uw factuurtabel, details in uw factuur_details-tabel en betalingen in uw betalingstabel. Om de consistentie te behouden, moet u ervoor zorgen dat deze allemaal zijn voltooid of dat geen van deze is voltooid. Als u waar u de factuur en de details moet toevoegen en er is een fout opgetreden bij het invoeren van de betaling, dan blijft uw database in een inconsistente staat.
Normaal gesproken wordt dit bereikt met behulp van een try/catch-blok zoals dit:
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");
}