sql >> Base de Datos >  >> RDS >> Mysql

Uso adecuado de php mysqli autocommit y rollback

Lo usa cuando tiene una serie de instrucciones sql que deben realizarse juntas para mantener la coherencia en su base de datos. Piense en llamar a commit como establecer un punto de guardado en un juego. Cada vez que llamas a rollback, deshaces todo lo que se hizo hasta la confirmación anterior.

Imagine una situación en la que necesita guardar una factura en su tabla de facturas, detalles en su tabla de detalles_factura y pagos en su tabla de pagos. Para mantener la consistencia, debe asegurarse de que se hayan hecho todos o de que no se haya hecho ninguno. Si agregó la factura y los detalles y luego hubo una falla al insertar el pago, entonces su base de datos queda en un estado inconsistente.

Normalmente esto se logra usando un bloque try/catch como este:

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