Postgres podporuje vnořené transakce, ale liší se od konvenčních SQL, spíše jako transakce s vnořenými dílčími body.
Na nejvyšší úrovni máte vždy svůj typický BEGIN/COMMIT/ROLLBACK a na vnořených úrovních musíte použít následující příkazy:
SAVEPOINT name- vytvoří nový bod uložení s jedinečným názvem pro transakciRELEASE SAVEPOINT name- potvrdí uložený bod, i když bude přetrvávat pouze v případě, že se transakce obsahujícíROLLBACK TO SAVEPOINT name- vrátí zpět bod uložení
Také byste se museli ujistit, že:
- Názvy používané pro každý
SAVEPOINTjsou jedinečné; - Selhání v jednom
SAVEPOINTse šíří nahoru do nejvyšší úrovně.
Poslední část je trochu složitější, pokud nepoužíváte knihovnu, která to za vás dokáže automaticky.
Když jsem psal pg-promise, ujistil jsem se, že tato dvě ustanovení jsou zaručena:
- Názvy bodů uložení generuje automaticky, jako
level_1,level_2, a tak dále, na základě úrovně transakce; - Provádí se obsahující
ROLLBACK TO SAVEPOINT name, plusROLLBACKnejvyšší úrovně pro případ, že podřízená transakce selže – vše je postaveno na standardní logice řetězení slibů.
Podívejte se také na vysvětlená omezení vnořených transakcí PostgreSQL...