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?
Antwort
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 ( ).
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 einerEXCEPTION
Klausel verwenden.
Es gibt spezielle Ausnahmen, einschließlich, aber nicht beschränkt auf:
- Daten geschrieben Dateien
-
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
- SQL Fiddle Demo
dblink
ruft 0
- 1. Erstellen benutzerdefinierter Spalten in postgres für gespeicherte Prozeduren
- 2. Gespeicherte Prozeduren in Hive
- 3. Gespeicherte Prozeduren in Rails verwenden
- 4. Gespeicherte Prozeduren werden in der Mergereplikation nicht repliziert.
- 5. Gespeicherte Prozeduren und Funktionen
- 6. Gespeicherte Prozeduren und Trigger in der Datenbank
- 7. Gespeicherte Prozeduren in .SQL-Dateien
- 8. Verschiedene gespeicherte Prozeduren parallel in EF6 ausführen
- 9. Gespeicherte Prozeduren mit SQLAlchemy erstellen
- 10. gespeicherte SQL-Prozeduren
- 11. Wie werden Strings (varchar) in gespeicherte SQL-Prozeduren übergeben?
- 12. Gespeicherte Prozeduren für komplexe Abfragen
- 13. Gespeicherte Prozeduren PHP
- 14. Muster für gespeicherte Prozeduren?
- 15. Gespeicherte Prozeduren im Entitätsframework
- 16. gespeicherte Prozeduren mit sqlAlchemy
- 17. clr gespeicherte Prozeduren mit zwei in Parametern
- 18. In MySQL sind gespeicherte Prozeduren effizienter?
- 19. Spionage- und Komponententest Gespeicherte Prozeduren in EF
- 20. So sichern Sie gespeicherte Prozeduren in MySQL
- 21. Neo4j 3.0.3 Gespeicherte Prozeduren in Scala
- 22. Benannte Parameter für gespeicherte Prozeduren in MySQL
- 23. Optionale Parameter in Mysql gespeicherte Prozeduren
- 24. Gespeicherte Prozeduren/Funktionen in allen Datenbanken durchsuchen
- 25. ASP.NET MVC Aufruf gespeicherte Prozeduren
- 26. EF4-Vererbung und gespeicherte Prozeduren
- 27. Regressionstests für gespeicherte T-SQL-Prozeduren
- 28. Spring Data und gespeicherte Prozeduren
- 29. SubSonic - Nicht-Crud Gespeicherte Prozeduren
- 30. MySQL: Ansichten vs gespeicherte Prozeduren
möglich Duplikat von [Execute postgreSQL gespeicherte Prozedur als eine Transaktion] (http://stackoverflow.com/questions/26406111/execute-postgresql-stored-procedure-as-one-transaction) –
Alle in dem Handbuch behandelt. Einschließlich der Tatsache, dass Sie technisch keine gespeicherten Prozeduren in PostgreSQL haben –
Also haben Sie Ihre Antwort? –