Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation correcte de php mysqli autocommit et rollback

Vous l'utilisez lorsque vous avez une série d'instructions sql qui doivent être exécutées ensemble pour maintenir la cohérence dans votre base de données. Pensez à appeler commit comme à établir un point de sauvegarde dans une partie. Chaque fois que vous appelez rollback, vous annulez tout ce qui a été fait jusqu'au commit précédent.

Imaginez une situation dans laquelle vous devez enregistrer une facture dans votre tableau des factures, des détails dans votre tableau des détails de la facture et des paiements dans votre tableau des paiements. Pour maintenir la cohérence, vous devez vous assurer que tout cela est fait ou qu'aucun d'entre eux n'est fait. Si vous souhaitez ajouter la facture et les détails, puis qu'il y a eu un échec lors de l'insertion du paiement, votre base de données est laissée dans un état incohérent.

Normalement, cela se fait à l'aide d'un bloc try/catch comme celui-ci :

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