67.3. Subtransacciones #

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.