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
Документацию для получения дополнительной информации.