sql >> Databáze >  >> RDS >> Mysql

Správné použití php mysqli autocommit a rollback

Používáte jej, když máte řadu příkazů SQL, které je nutné provést společně, aby byla zachována konzistence databáze. Berte zavolání commitu jako vytvoření záchranného bodu ve hře. Kdykoli zavoláte rollback, vrátíte zpět vše, co bylo provedeno do předchozího potvrzení.

Představte si situaci, kdy potřebujete uložit fakturu do tabulky faktur, podrobnosti do tabulky Detaily faktury a platby do tabulky plateb. Chcete-li zachovat konzistenci, musíte se ujistit, že jsou všechny provedeny, nebo není dokončen žádný z nich. Pokud kam přidat fakturu a podrobnosti a poté došlo k chybě při vložení platby, vaše databáze zůstane v nekonzistentním stavu.

Normálně se to provádí pomocí bloku try/catch, jako je tento:

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. DB Control se blíží ke své smrti

  2. Načtěte řádek, který má pro sloupec maximální hodnotu

  3. Aktualizovat časové razítko při aktualizaci řádku v PostgreSQL

  4. Jak mohu nastavit limit velikosti pro datový typ int v PostgreSQL 9.5