Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Właściwe użycie php mysqli autocommit i rollback

Używasz go, gdy masz serię instrukcji sql, które muszą być wykonywane razem, aby zachować spójność w bazie danych. Pomyśl o wywołaniu zatwierdzenia jako o ustaleniu punktu zapisu w grze. Za każdym razem, gdy wywołujesz wycofanie, cofasz wszystko, co zostało zrobione przed poprzednim zatwierdzeniem.

Wyobraź sobie sytuację, w której musisz zapisać fakturę w tabeli faktur, szczegóły w tabeli faktur_szczegóły, a płatności w tabeli płatności. Aby zachować spójność, musisz upewnić się, że wszystkie są zrobione lub żadna z nich nie jest wykonana. Jeżeli Ty, gdzie dodać fakturę i dane, a następnie nie udało się wprowadzić płatności, to Twoja baza danych pozostaje w niespójnym stanie.

Zwykle odbywa się to za pomocą bloku try/catch w ten sposób:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak podzielić ciąg nazwy w mysql?

  2. Przechowuj plik PDF w MySQL

  3. Składnia parametrów wejściowych w zapytaniu MySQL

  4. Przekształć wynik bazy danych w tablicę

  5. Jak uruchomić skrypt powłoki po ponownym uruchomieniu?