PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Unterstützt Postgres verschachtelte oder autonome Transaktionen?

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 Namen
  • RELEASE SAVEPOINT name - schreibt den Sicherungspunkt fest, obwohl er nur bestehen bleibt, wenn die enthaltende Transaktion festschreibt
  • ROLLBACK 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 , plus ROLLBACK 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...