Postgres поддържа вложени транзакции, но те се различават от конвенционалния SQL, по-скоро като транзакции с вложени частични точки.
На най-горното ниво винаги имате своя типичен BEGIN/COMMIT/ROLLBACK
, а на вложени нива трябва да използвате следните команди:
SAVEPOINT name
- създава нова точка за запис, с име, уникално за транзакциятаRELEASE SAVEPOINT name
- записва точката на запис, въпреки че тя ще продължи само ако съдържащата я транзакция се задължиROLLBACK TO SAVEPOINT name
- връща назад точката за запис
Трябва също така да се уверите, че:
- Имената, използвани за всяка
SAVEPOINT
са уникални; - Неуспех в една
SAVEPOINT
се разпространява нагоре до най-горното ниво.
Последният бит е малко труден, освен ако не използвате библиотека, която може да направи това автоматично вместо вас.
Когато написах pg-promise, се уверих, че тези две разпоредби са гарантирани:
- Той генерира имена на точки за запис автоматично, като
level_1
,level_2
и така нататък въз основа на нивото на транзакцията; - Изпълнява се, съдържащо
ROLLBACK TO SAVEPOINT name
, плюсROLLBACK
от най-високо ниво в случай, че дъщерната транзакция се провали – всичко е изградено на базата на стандартната логика за верижно обещание.
Вижте също обяснените ограничения на вложените транзакции на PostgreSQL...