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...