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
SAVEPOINT
sprids 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ånROLLBACK
om en underordnad transaktion misslyckas - allt byggt på standardlogiken för löfteskedja.
Se även begränsningarna för PostgreSQL kapslade transaktioner förklarade...