sql >> Database teknologi >  >> RDS >> Mysql

Korrekt brug af php mysqli autocommit og rollback

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



  1. SQLite JSON_TREE()

  2. Hvordan man proaktivt indsamler SQL Server-indekser Fragmenteringsoplysninger

  3. ODP.NET Oracle.ManagedDataAcess tilfældige ORA-12570-fejl

  4. Hvordan bestiller man en MySQL-forespørgsel efter en specifik kolonne?