Postgres obsługuje zagnieżdżone transakcje, ale różnią się one od konwencjonalnego SQL, bardziej jak transakcje z zagnieżdżonymi punktami częściowymi.
Na najwyższym poziomie zawsze masz swój typowy BEGIN/COMMIT/ROLLBACK , a na poziomach zagnieżdżonych musisz użyć następujących poleceń:
SAVEPOINT name- tworzy nowy punkt zapisu o nazwie unikalnej dla transakcjiRELEASE SAVEPOINT name- zatwierdza punkt zapisu, choć będzie on trwał tylko wtedy, gdy transakcja zawierająca zostanie zatwierdzonaROLLBACK TO SAVEPOINT name- cofa punkt zapisu
Musisz również upewnić się, że:
- Nazwy używane dla każdego
SAVEPOINTsą unikalne; - Awaria w jednym
SAVEPOINTjest propagowany w górę do najwyższego poziomu.
Ostatni fragment jest trochę trudny, chyba że używasz biblioteki, która może to zrobić automatycznie.
Kiedy pisałem pg-promise, upewniłem się, że te dwa warunki są gwarantowane:
- Automatycznie generuje nazwy punktów zapisu, jako
level_1,level_2, i tak dalej, w zależności od poziomu transakcji; - Wykonuje się zawierający
ROLLBACK TO SAVEPOINT name, plus najwyższego poziomuROLLBACKw przypadku niepowodzenia transakcji podrzędnej - wszystko oparte na standardowej logice tworzenia łańcucha obietnic.
Zobacz także wyjaśnione ograniczenia transakcji zagnieżdżonych PostgreSQL...