5

Wenn eine gespeicherte Prozedur in der Mitte fehlschlägt, werden Änderungen an diesem Punkt vom Anfang des SP implizit zurückgesetzt, oder müssen wir expliziten Code schreiben, um sicherzustellen, dass SP nur in einer Datenbanktransaktion ausgeführt wird?Werden gespeicherte Prozeduren in der Datenbanktransaktion in Postgres ausgeführt?

+0

möglich Duplikat von [Execute postgreSQL gespeicherte Prozedur als eine Transaktion] (http://stackoverflow.com/questions/26406111/execute-postgresql-stored-procedure-as-one-transaction) –

+0

Alle in dem Handbuch behandelt. Einschließlich der Tatsache, dass Sie technisch keine gespeicherten Prozeduren in PostgreSQL haben –

+0

Also haben Sie Ihre Antwort? –

Antwort

15

Genau genommen hat Postgres derzeit (bis einschließlich Version 9.5) keine "Stored Procedures" wie im ANSI-Standard definiert. Alles wird stattdessen mit "Funktionen" erledigt, die fast die gleiche Funktionalität (und mehr) bieten, wie andere RDBMS mit gespeicherten Prozeduren bieten. Der Hauptunterschied ist die Transaktionsabwicklung.

Functions sind atomic in Postgres und automatisch innerhalb ihrer eigenen Transaktion ausgeführt werden, wenn innerhalb einer äußeren Transaktion genannt. Sie laufen immer innerhalb einer einzigen Transaktion und erfolgreich oder fehlgeschlagen komplett. Folglich kann man keine Transaktionen innerhalb der Funktion beginnen oder festschreiben. Befehle wie VACUUM oder CREATE INDEX CONCURRENTLY, die nicht innerhalb eines Transaktionsblocks ausgeführt werden können, sind nicht zulässig.

Per documentation on PL/pgSQL:

Funktionen und Trigger Prozeduren werden immer innerhalb einer von einer äußeren Abfrage etablierten Transaktion ausgeführt - sie nicht oder diese Transaktion verpflichten beginnen, da es für sie keinen Zusammenhang zu in ausführen würde. Ein Block, der eine EXCEPTION-Klausel enthält, bildet jedoch effektiv eine Subtransaktion, die rückgängig gemacht werden kann, ohne die äußere Transaktion zu beeinflussen ( ).

Error handling:

standardmäßig jeder Fehler in einer PL/pgSQL Funktion auftretenden bricht Ausführung der Funktion, und zwar der Transaktion umgebenden sowie. Sie können Fehler erfassen und wiederherstellen, indem Sie einen BEGIN Block mit einer EXCEPTION Klausel verwenden.

Es gibt spezielle Ausnahmen, einschließlich, aber nicht beschränkt auf:

  • Daten geschrieben Dateien
  • changes made to a sequence

    Wichtige zu protokollieren: Einige Typen PostgreSQL Daten und Funktionen haben spezielle Regeln r egardierendes Transaktionsverhalten. Insbesondere sind Änderungen an einer Sequenz (und daher der Zähler einer Spalte mit serial) sofort für alle anderen Transaktionen sichtbar und werden nicht zurückgesetzt zurück, wenn die Transaktion, die die Änderungen vorgenommen hat abgebrochen.

  • Prepared Statements

  • dblink

  • ruft 0
Verwandte Themen