Die Idee, die ich im Allgemeinen verwende, wenn ich mit Transaktionen arbeite, sieht so aus:(Semi-Pseudo-Code) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
Beachten Sie, dass bei dieser Idee eine Ausnahme ausgelöst werden muss, wenn eine Abfrage fehlschlägt:
- PDO kann das, je nachdem, wie Sie es konfigurieren
- Siehe
PDO::setAttribute
- und
PDO::ATTR_ERRMODE
undPDO::ERRMODE_EXCEPTION
- Siehe
- Andernfalls müssen Sie bei einer anderen API möglicherweise das Ergebnis der Funktion testen, die zum Ausführen einer Abfrage verwendet wird, und selbst eine Ausnahme auslösen.
Leider ist da keine Magie im Spiel. Sie können nicht einfach irgendwo eine Anweisung platzieren und Transaktionen automatisch ausführen lassen:Sie müssen immer noch festlegen, welche Gruppe von Abfragen in einer Transaktion ausgeführt werden muss.
Zum Beispiel haben Sie ziemlich oft ein paar Abfragen vor der Transaktion (vor dem begin
) und ein paar weitere Abfragen nach der Transaktion (nach entweder commit
oder rollback
) und Sie möchten, dass diese Abfragen ausgeführt werden, egal was (oder nicht) passiert ist in der Transaktion.