Postgres unterstützt verschachtelte Transaktionen, aber sie unterscheiden sich von herkömmlichem SQL, eher wie Transaktionen mit verschachtelten Teilpunkten.
Auf der obersten Ebene haben Sie immer Ihr typisches BEGIN/COMMIT/ROLLBACK
, und auf verschachtelten Ebenen müssen Sie die folgenden Befehle verwenden:
SAVEPOINT name
- Erstellt einen neuen Sicherungspunkt mit einem für die Transaktion eindeutigen NamenRELEASE SAVEPOINT name
- schreibt den Sicherungspunkt fest, obwohl er nur bestehen bleibt, wenn die enthaltende Transaktion festschreibtROLLBACK TO SAVEPOINT name
- setzt den Sicherungspunkt zurück
Sie müssten auch Folgendes sicherstellen:
- Die für jeden
SAVEPOINT
verwendeten Namen sind einzigartig; - Fehler an einem
SAVEPOINT
wird nach oben bis zur obersten Ebene propagiert.
Der letzte Teil ist ein bisschen knifflig, es sei denn, Sie verwenden eine Bibliothek, die das automatisch für Sie erledigen kann.
Als ich pg-promise schrieb, stellte ich sicher, dass diese beiden Bestimmungen garantiert sind:
- Er generiert Speicherpunktnamen automatisch als
level_1
,level_2
, usw., basierend auf der Transaktionsebene; - Es wird mit
ROLLBACK TO SAVEPOINT name
ausgeführt , plusROLLBACK
der obersten Ebene für den Fall, dass eine untergeordnete Transaktion fehlschlägt – alles basierend auf der standardmäßigen Promise-Chaining-Logik.
Siehe auch die Einschränkungen der verschachtelten PostgreSQL-Transaktionen erklärt...