Las subtransacciones se inician dentro de las transacciones, lo que permite dividir transacciones grandes en unidades más pequeñas. Las subtransacciones se pueden confirmar o abortar sin afectar a sus transacciones padre, lo que permite que las transacciones padre continúen. Esto permite manejar los errores más fácilmente, lo cual es un patrón común de desarrollo de aplicaciones. La palabra subtransacción a menudo se abrevia como subxact.
Las subtransacciones se pueden iniciar explícitamente utilizando el comando
SAVEPOINT, pero también se pueden iniciar de otras maneras,
como la cláusula EXCEPTION de PL/pgSQL. PL/Python y PL/Tcl
también admiten subtransacciones explícitas. Las subtransacciones también se pueden
iniciar desde otras subtransacciones. La transacción de nivel superior y sus
subtransacciones hijas forman una jerarquía o árbol, razón por la cual nos referimos
a la transacción principal como la transacción de nivel superior.
Si a una subtransacción se le asigna un ID de transacción no virtual, su ID de transacción se denomina “subxid”. A las subtransacciones de solo lectura no se les asignan subxids, pero una vez que intentan escribir, se les asignará uno. Esto también hace que a todos los padres de un subxid, hasta e incluyendo la transacción de nivel superior, se les asignen IDs de transacción no virtuales. Nos aseguramos de que un xid padre sea siempre menor que cualquiera de sus subxids hijos.
El xid padre inmediato de cada subxid se registra en el directorio
pg_subtrans. No se realiza ninguna entrada para los xids de
nivel superior ya que no tienen un padre, ni se realiza una entrada para las
subtransacciones de solo lectura.
Una subtransacción se confirma, todas sus subtransacciones hijas confirmadas con subxids también se considerarán subconfirmadas en esa transacción. Cuando una subtransacción se aborta, todas sus subtransacciones hijas también se considerarán abortadas.
Cuando una transacción de nivel superior con un xid se confirma, todas sus subtransacciones
hijas subconfirmadas también se registran de forma persistente como confirmadas en el
subdirectorio pg_xact. Si la transacción de nivel superior se aborta,
todas sus subtransacciones también se abortan, incluso si estaban subconfirmadas.
Cuantas más subtransacciones mantenga abiertas cada transacción (not
rolled back or released), mayor será la sobrecarga de gestión de transacciones. Se almacenan en caché hasta
64 subxids abiertos en la memoria compartida para cada backend; después de ese punto, la
sobrecarga de E/S de almacenamiento aumenta significativamente debido a búsquedas adicionales de
entradas de subxid en el directorio pg_subtrans.