Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Korrekte Verwendung von php mysqli autocommit und rollback

Sie verwenden es, wenn Sie eine Reihe von SQL-Anweisungen haben, die zusammen ausgeführt werden müssen, um die Konsistenz in Ihrer Datenbank aufrechtzuerhalten. Stellen Sie sich das Aufrufen von Commit als das Einrichten eines Speicherpunkts in einem Spiel vor. Jedes Mal, wenn Sie Rollback aufrufen, machen Sie alles rückgängig, was bis zum vorherigen Commit gemacht wurde.

Stellen Sie sich eine Situation vor, in der Sie eine Rechnung in Ihrer Rechnungstabelle, Details in Ihrer Rechnungsdetails-Tabelle und Zahlungen in Ihrer Zahlungstabelle speichern müssen. Um die Konsistenz aufrechtzuerhalten, müssen Sie sicherstellen, dass diese alle ausgeführt werden oder keines davon ausgeführt wird. Wenn Sie die Rechnung und die Details hinzufügen und dann beim Einfügen der Zahlung ein Fehler aufgetreten ist, bleibt Ihre Datenbank in einem inkonsistenten Zustand.

Normalerweise wird dies mit einem Try/Catch-Block wie diesem erreicht:

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");
}