Postgres stöder kapslade transaktioner, men de skiljer sig från konventionell SQL, mer som transaktioner med kapslade delpunkter.
På den översta nivån har du alltid din typiska BEGIN/COMMIT/ROLLBACK , och på kapslade nivåer måste du använda följande kommandon:
SAVEPOINT name- skapar en ny räddningspunkt, med namn unikt för transaktionenRELEASE SAVEPOINT name- commits räddningspunkten, även om den bara kvarstår om den innehållande transaktionen commitsROLLBACK TO SAVEPOINT name- rullar tillbaka räddningspunkten
Du måste också se till att:
- Namnen som används för varje
SAVEPOINTär unika; - Fel i en
SAVEPOINTsprids uppåt till den översta nivån.
Den sista biten är lite knepig, om du inte använder ett bibliotek som kan göra det åt dig automatiskt.
När jag skrev pg-promise såg jag till att dessa två bestämmelser är garanterade:
- Den genererar räddningspunktsnamn automatiskt, som
level_1,level_2, och så vidare, baserat på transaktionsnivån; - Den körs som innehåller
ROLLBACK TO SAVEPOINT name, plus toppnivånROLLBACKom en underordnad transaktion misslyckas - allt byggt på standardlogiken för löfteskedja.
Se även begränsningarna för PostgreSQL kapslade transaktioner förklarade...