Du bruger det, når du har en række sql-sætninger, der skal udføres sammen for at opretholde konsistens i din database. Tænk på at kalde commit som at etablere et redningspunkt i et spil. Hver gang du ringer tilbage, fortryder du alt, hvad der blev gjort op til den forrige commit.
Forestil dig en situation, hvor du skal gemme en faktura i din fakturatabel, detaljer i din invoice_details tabel og betalinger i din betalingstabel. For at bevare konsistensen skal du sikre dig, at disse er alle færdige, eller ingen af dem er færdige. Hvis du skulle tilføje fakturaen og detaljerne, og der var en fejl ved indsættelse af betalingen, efterlades din database i en inkonsekvent tilstand.
Normalt opnås dette ved at bruge en try/catch-blok som denne:
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");
}