O PostgreSQL não suporta sub-transações, mas o SAVEPOINT
recurso pode efetivamente atender sua necessidade. Citando a documentação da camada de acesso Avançado ao PG via promessas de Vitaly Tomilov no GitHub:
O PostgreSQL não possui suporte adequado para transações aninhadas, apenas suporta reversões parciais por meio de pontos de salvamento nas transações. A diferença entre as duas técnicas é enorme, como explicado mais adiante.
O suporte adequado para transações aninhadas significa que o resultado de uma sub-transação bem-sucedida não é revertido quando sua transação pai é revertida. Porém, com os pontos de salvamento do PostgreSQL, se você reverter a transação de nível superior, o resultado de todos os pontos de salvamento internos também será revertido.
Os pontos de salvamento podem ser usados para reversões parciais para um ponto anterior dentro de uma transação ativa. Por exemplo, para estabelecer um ponto de salvamento e depois desfazer os efeitos de todos os comandos executados após o estabelecimento:
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;
A transação acima irá inserir os valores 1 e 3, mas não 2. Consulte a SAVEPOINT
documentação para obter mais informações.