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
SAVEPOINT
są unikalne; - Awaria w jednym
SAVEPOINT
jest 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 poziomuROLLBACK
w 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...