Postgres understøtter indlejrede transaktioner, men de adskiller sig fra den konventionelle SQL, mere som transaktioner med indlejrede delpunkter.
På det øverste niveau har du altid din typiske BEGIN/COMMIT/ROLLBACK
, og på indlejrede niveauer skal du bruge følgende kommandoer:
SAVEPOINT navn
- opretter et nyt lagringspunkt, med navn unikt for transaktionenRELEASE SAVEPOINT navn
- begår lagringspunktet, selvom det kun vil fortsætte, hvis den indeholdende transaktion begårRULL TILBAGE TIL SAVEPOINT navn
- ruller lagringspunktet tilbage
Du skal også sørge for at:
- Navnene, der bruges til hver
SAVEPOINT er unikke;
- Fejl i ét
SAVEPOINT
forplantes opad til det øverste niveau.
Det sidste er lidt vanskeligt, medmindre du bruger et bibliotek, der automatisk kan gøre det for dig.
Da jeg skrev pg-promise, sørgede jeg for, at disse to bestemmelser er garanteret:
- Den genererer automatisk navne på lagringspunkter som
level_1
,niveau_2
, og så videre, baseret på transaktionsniveauet; - Den udføres indeholdende
ROLLBACK TO SAVEPOINT navn
plusROLLBACK
på øverste niveau i tilfælde af at en underordnet transaktion mislykkes - alt sammen bygget på standardlogikken for løftekæder.
Se også begrænsningerne for PostgreSQL indlejrede transaktioner forklaret...