0%

Mehrere Änderungen, ein Ergebnis · Übung

Den gesamten Versuch zurückrollen

Der Aufruf mit fehlendem Mitglied hat jetzt einen benannten Fehler: sqlite3.IntegrityError. Seine frühere Einfügung ist weiterhin offen, also muss die Funktion eine ausdrückliche Fehlerentscheidung treffen.

Öffne transactions.py. Schließe die beiden Einfügungen, das Festschreiben und die erfolgreiche Rückgabe in einen try-Block ein. Füge dann diesen eng begrenzten Handler hinzu:

except sqlite3.IntegrityError:
    connection.rollback()
    return False

rollback() verwirft Änderungen, die auf dieser Verbindung noch offen sind. Es löscht keine alten festgeschriebenen Ausleihvorgänge. Hier entfernt es Ausleihvorgang 7101, den gültigen Anfang des fehlgeschlagenen Paares.

Behalte connection.commit() hinter beiden Einfügungen im Erfolgszweig bei. Das vollständige Verhalten ist jetzt:

ErgebnisTransaktionsentscheidungRückgabewert
Beide Einfügungen gelingenBeide festschreibenTrue
Eine der Einfügungen verletzt eine IntegritätsregelOffene Arbeit zurückrollenFalse

Klicke auf Run. Der gültige Block sollte beim erneuten Öffnen weiterhin die IDs [7001, 7002] zeigen. Der Block mit fehlendem Mitglied sollte jetzt False melden, keinen Datenbankregelfehler nach außen weitergeben und auf beiden Verbindungen keine vorgeschlagenen IDs zeigen.

Der Handler fängt nur sqlite3.IntegrityError ab. Fange weder Exception noch alle sqlite3.Error-Werte ab. Wenn ein anderer Fehler auftaucht, etwa ungültiges SQL oder ein unbrauchbares Python-Argument, würde die Rückgabe von False ihn wie das bekannte Katalogergebnis aussehen lassen. Dieser andere Fehler soll sichtbar bleiben.

Submit setzt die fehlerhafte Zeile in einem Fall zuerst und in einem anderen an die zweite Stelle. Außerdem beginnt es mit unabhängigen festgeschriebenen Zeilen und prüft, dass diese erhalten bleiben. Ein Rollback soll diesen Paarversuch auflösen, nicht die Tabelle leeren. Abschließend führt es eine harmlose Abfrage über die übergebene Verbindung aus, weil das Auflösen der Transaktion die Verantwortung für die Verbindung nicht an diese Funktion überträgt.

Dieser manuelle Zweig ist korrekt, und es lohnt sich, ihn einmal zu sehen. Du kannst dieselben Ergebnisse behalten und dabei die Verbindung ihre üblichen Commit- und Rollback-Entscheidungen treffen lassen.

Aufgabe

Aktualisiere checkout_pair, sodass ein gültiges Paar festgeschrieben wird und True zurückgibt. Fange nur sqlite3.IntegrityError ab, rolle den offenen Versuch zurück und gib False zurück.

Erhalte bestehende festgeschriebene Zeilen, lass andere Fehler nach außen weiterlaufen und lass die übergebene Verbindung offen.