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
SAVEPOINTforplantes 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 navnplusROLLBACKpå ø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...