Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Uso adequado do autocommit e rollback do php mysqli


Você o usa quando tem uma série de instruções sql que devem ser executadas juntas para manter a consistência em seu banco de dados. Pense em chamar commit como estabelecer um save point em um jogo. Sempre que você chama o rollback, você desfaz tudo o que foi feito até o commit anterior.

Imagine uma situação em que você precisa salvar uma fatura em sua tabela de faturas, detalhes em sua tabela invoice_details e pagamentos em sua tabela de pagamentos. Para manter a consistência, você precisa ter certeza de que tudo foi feito ou nenhum deles foi feito. Se você adicionar a fatura e os detalhes e houver uma falha na inserção do pagamento, seu banco de dados ficará em um estado inconsistente.

Normalmente isso é feito usando um bloco 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");
}