PostgreSQL no admite subtransacciones, pero la SAVEPOINT
función puede responder eficazmente a su necesidad. Citando de la documentación de la capa de acceso avanzado a PG a través de las promesas de Vitaly Tomilov en GitHub:
PostgreSQL no tiene soporte adecuado para transacciones anidadas, solo soporta reversiones parciales a través de puntos de guardado dentro de transacciones. La diferencia entre las dos técnicas es enorme, como se explica más adelante.
El soporte adecuado para transacciones anidadas significa que el resultado de una subtransacción exitosa no se revierte cuando se revierte su transacción principal. Pero con los puntos de guardado de PostgreSQL, si revierte la transacción de nivel superior, el resultado de todos los puntos de guardado internos también se revierte.
Los puntos de rescate se pueden usar para retrocesos parciales a un punto anterior dentro de una transacción activa. Por ejemplo, para establecer un punto de rescate y luego deshacer los efectos de todos los comandos ejecutados después de que se estableció:
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;
La transacción anterior insertará los valores 1 y 3, pero no 2. Consulte la SAVEPOINT
documentación para obtener más información.