PHP PDO Angelegenheiten und auto-commit
Nun verbunden über PDO ging vor Beginn der Abfrage, müssen Sie zuerst verstehen, wie PDO ist Angelegenheiten zu verwalten.
Transaktionsunterstützung vier Eigenschaften (ACID):
- Atomicity (Unteilbarkeit)
- Konsistenz (Konsistenz)
- Isolation (Isolation)
- Persistent (Haltbarkeit)
Noch einfacher ausgeführt alle Operationen in einer Transaktion, auch eine schrittweise Umsetzung, sondern auch die Sicherheit auf die Datenbank angewendet zu gewährleisten, und nicht rechtzeitig Störungen von anderen Verbindungen eingereicht werden.
Transaktionsvorgänge können auch auf Wunsch automatisch widerrufen werden (noch nicht vorgelegt vorausgesetzt), die es einfacher macht Fehler in einem Skript zu behandeln.
Die Transaktion wird in der Regel durch eine Reihe von Veränderungen "savings" gemacht und dann in Wirkung kommen und umgesetzt werden; Vorteile, dies zu tun ist die Effizienz dieser bereitzustellen kann stark verändert werden.
Mit anderen Worten, können Transaktionen Ihre Skripte schneller und potentiell robuster zu machen (Sie müssen sie trotzdem sie korrekt verwenden, um davon zu profitieren).
Leider unterstützt nicht jede Datenbank-Transaktionen, also, wenn Sie zuerst die Verbindung zu öffnen, PDO erfordert so genannte "auto-commit" Betriebsmodus.
Auto-Commit-Modus bedeutet, dass, wenn die Datenbankunterstützung, jede Abfrage ausführen ihre eigene implizite Transaktion besitzt, wenn die Datenbank keine Transaktionen unterstützt, nein.
Wenn Sie eine Transaktion benötigen, müssen Sie das PDO :: begintransaction () -Methode zu starten verwenden. Wenn die zugrunde liegenden Treiber keine Transaktionen unterstützt, eine Ausnahme PDOException werfen (unabhängig davon, welche Art der Fehlerbehandlung Einstellungen, dann ist dies ein schwerwiegender Fehler Bedingung).
Sobald die Transaktion verfügbar PDO :: commit () oder PDO :: rollback () abgeschlossen ist, auf den Transaktionscode in Abhängigkeit erfolgreich ausgeführt wird.
Hinweis: PDO nur , ob die Transaktionsverarbeitungsfähigkeit in der Treiberschicht Inspektion. Wenn einige Laufzeitbedingung bedeutet, dass eine Transaktion nicht zur Verfügung steht, und der Datenbankdienst akzeptiert eine Anforderung, die Transaktion zu initiieren, PDO :: begintransaction () wird immer noch TRUE zurück, und keine Fehler. Versuchen Sie, die Transaktion mit der MySQL-Datenbank MyISAM-Tabellen ist ein gutes Beispiel.
Wenn das Skript beendet oder die Verbindung ist, geschlossen zu werden, wenn es nicht eine abgeschlossene Transaktion, wird PDO automatisch die Transaktion rückgängig zu machen. Diese Sicherheitsmaßnahme hilft Inkonsistenzen zu vermeiden, in das Script unerwartet beendet wird - wenn nicht explizit die Transaktion fest, dann ist die Annahme falsch irgendwo ist, so dass die Rollback durchgeführt wird, die Datensicherheit zu gewährleisten.
Hinweis: Nur eine Transaktion starten PDO :: begintransaction () später, kann sie automatisch zurückgerollt passieren. Wenn Sie manuell eine Abfrage, eine Transaktion zu starten, kann der PDO nicht wissen, so dass, wenn nötig, kann nicht rückgängig gemacht werden.
In einer Transaktion ausgeführt Batch:
Im folgenden Beispiel an, dass Sie eine Reihe von Einträgen für die neuen Mitarbeiter erstellen, weisen eine ID 23 ist. Zusätzlich zu den Basisdaten Registrierung Person, sondern müssen auch Sie sein Gehalt zu erfassen.
Beide Updates sind abgeschlossen ist sehr einfach, aber durch das PDO :: begintransaction Schließen () und PDO :: commit () Aufruf ist es möglich, dass, bevor die Änderungen zu gewährleisten, andere Menschen können diese Änderungen nicht zu sehen.
Wenn ein Fehler auftritt, blockiert man für alle Änderungen seit der Transaktion wurde wieder von Anfang an aufgerollt wird, und gibt eine Fehlermeldung aus.
<?php try { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connected\n"; } catch (Exception $e) { die("Unable to connect: " . $e->getMessage()); } try { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"); $dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())"); $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); echo "Failed: " . $e->getMessage(); } ?>
Ist das nicht zu Änderungen in der Transaktion begrenzt, es kann komplexe Abfragen ausgeben Daten zu extrahieren, sondern auch Änderungen und Abfrage mit, dass die Informationen zu bauen, wenn die Transaktion aktiv ist, können Sie, dass andere Menschen können in die laufende Operation keine Änderungen vornehmen sicherstellen können.