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ý
SAVEPOINT
jsou jedinečné; - Selhání v jednom
SAVEPOINT
se šíří 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
, plusROLLBACK
nejvyšší ú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...