sql >> Databasteknik >  >> RDS >> PostgreSQL

Körs lagrade procedurer i databastransaktioner i Postgres?

Postgres har strängt taget inte ha lagrade procedurer enligt definitionen i ISO/IEC-standarden före version 11. Termen används ofta felaktigt för att referera till funktioner , som ger mycket av samma funktionalitet (och mer) som andra RDBMS tillhandahåller med "lagrade procedurer". Den största skillnaden är transaktionshantering.

  • Vilka är skillnaderna mellan "Lagrade procedurer" och "Lagrade funktioner"?

Sanna lagrade procedurer äntligen introduceras med Postgres 11:

  • När ska man använda lagrad procedur/användardefinierad funktion?

Funktioner är atomära i Postgres och körs automatiskt i sin egen transaktion om de inte anropas inom en yttre transaktion. De körs alltid i en enda transaktion och lyckas eller misslyckas helt . Följaktligen kan man inte påbörja eller utföra transaktioner inom funktionen. Och kommandon som VACUUM , CREATE DATABASE , eller CREATE INDEX CONCURRENTLY som inte körs i transaktionssammanhang är inte tillåtna.

Manualen om PL/pgSQL:

Funktioner och triggerprocedurer exekveras alltid inom en transaktion som upprättats av en yttre fråga - de kan inte starta eller utföra den transaktionen, eftersom det inte skulle finnas något sammanhang för dem att exekvera i. Ett block som innehåller en EXCEPTION klausul bildar i praktiken en deltransaktion som kan återställas utan att påverka den yttre transaktionen.

Felhantering:

Som standard avbryter alla fel som uppstår i en PL/pgSQL-funktion exekveringen av funktionen, och faktiskt också den omgivande transaktionen. Du kan fånga fel och återställa från dem genom att använda en BEGIN block med en EXCEPTION klausul.

Det finns undantag , inklusive men inte begränsat till:

  • data skrivna till loggfiler
  • ändringar som gjorts i en sekvens

    Viktigt :Vissa PostgreSQL-datatyper och funktioner har särskilda regler för transaktionsbeteende. I synnerhet ändringar som gjorts i sekvensen (och därför räknaren för en kolumn som deklareras med serial ) är omedelbart synliga för alla andra transaktioner och återställs inte om transaktionen som gjorde ändringarna avbryts.

  • förberedda uttalanden

    • SQL Fiddle-demo
  • dblink-samtal (eller liknande)

    • Stöder Postgres kapslade eller autonoma transaktioner?


  1. En recension av de nya analytiska fönsterfunktionerna i MySQL 8.0

  2. Ska jag indexera primärnyckelkolumner i Oracle

  3. Hur man använder Kör omedelbart med INTO-klausul i Oracle Database

  4. Hur COT() fungerar i MariaDB