Używasz go, gdy masz serię instrukcji sql, które muszą być wykonywane razem, aby zachować spójność w bazie danych. Pomyśl o wywołaniu zatwierdzenia jako o ustaleniu punktu zapisu w grze. Za każdym razem, gdy wywołujesz wycofanie, cofasz wszystko, co zostało zrobione przed poprzednim zatwierdzeniem.
Wyobraź sobie sytuację, w której musisz zapisać fakturę w tabeli faktur, szczegóły w tabeli faktur_szczegóły, a płatności w tabeli płatności. Aby zachować spójność, musisz upewnić się, że wszystkie są zrobione lub żadna z nich nie jest wykonana. Jeżeli Ty, gdzie dodać fakturę i dane, a następnie nie udało się wprowadzić płatności, to Twoja baza danych pozostaje w niespójnym stanie.
Zwykle odbywa się to za pomocą bloku try/catch w ten sposób:
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");
}