sql >> Databasteknik >  >> RDS >> Mysql

Korrekt användning av php mysqli autocommit och rollback

Du använder det när du har en serie sql-satser som måste utföras tillsammans för att upprätthålla konsistens i din databas. Tänk på att syna commit som att skapa en räddningspunkt i ett spel. Varje gång du ringer återställning ångrar du allt som gjordes fram till föregående commit.

Föreställ dig en situation där du behöver spara en faktura i din fakturatabell, detaljer i din invoice_details-tabell och betalningar i din betalningstabell. För att bibehålla konsistensen måste du se till att alla dessa är klara eller att ingen av dem är klar. Om du skulle lägga till fakturan och detaljerna och sedan det uppstod ett misslyckande med att infoga betalningen så lämnas din databas i ett inkonsekvent tillstånd.

Normalt görs detta med ett försök/fånga-block så här:

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



  1. php:SQLSTATE[HY000] [2002] Ingen anslutning kunde göras eftersom måldatorn aktivt vägrade det

  2. problem med att använda Oracle-parametrar i SELECT IN

  3. Jämför datumvärden för CURDATE() med ett fullständigt tidsstämpelfält

  4. beräkna och visa ett datum som "sekunder sedan", "minut sedan", "timmar sedan" etc.