PostgreSQL не підтримує суб-транзакції, але ця SAVEPOINT
функція може ефективно відповідати вашим потребам. Цитування з документації Advanced шару доступу до PG через обіцянки по Віталію Томілова на GitHub:
PostgreSQL не має належної підтримки вкладених транзакцій, він підтримує лише часткові зворотні звороти через точки збереження всередині транзакцій. Різниця між двома методиками величезна, як пояснено далі.
Належна підтримка вкладених транзакцій означає, що результат вдалої транзакції не повертається назад, коли його батьківська транзакція повертається назад. Але з PostgreSQL точками збереження, якщо ви відкатуєте транзакцію верхнього рівня, результат усіх внутрішніх точок збереження також відкочується.
Точки збереження можуть використовуватися для часткових відкотів до попередньої точки всередині активної транзакції. Наприклад, щоб встановити точку збереження та пізніше скасувати ефекти всіх команд, виконаних після її встановлення:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
У вищевказаній транзакції будуть вставлені значення 1 і 3, але не 2. Дивіться SAVEPOINT
документацію для отримання додаткової інформації.