Les sous-transactions sont commencées dans des transactions, permettant à de grosses transactions d'être séparées en plusieurs unités plus petites. Les sous-transactions peuvent être validées ou annulées sans affecter leurs transactions parents, permettant ainsi aux transactions parents de continuer. Cela permet une gestion plus facile des erreurs, qui est un problèm fréquent lors du développement d'applications. Le mot sous-transaction est souvent abrégé en subxact.
Les sous-transactions peuvent être démarrées explicitement en utilisant
la commande SAVEPOINT
, mais peuvent aussi être
démarrées d'autres façons, par exemple avec la clause
EXCEPTION
en PL/pgSQL.
PL/Python and PL/TCL acceptent aussi les sous-transactions explicites.
Les sous-transactions peuvent aussi être démarrées à partir d'autres
sous-transactions. La transaction de niveau haut et ses sous-transactions
forment une hiérarchie ou arbre, ce qui explique pour nous faisons
référence à la transaction principale avec le terme de transaction de
niveau haut.
Si une sous-transaction est affectée à un identifiant de transaction non virtuel, son identifiant de transaction est nommé un « subxid ». Les transactions en lecture seule ne se voient pas affectées de subxid, mais une fois qu'elles écrivent, elles s'en voient affecter un. Une réaction en chaîne réalise une affectation d'identifiants de transactions non virtuels aux parents de la subxid et ainsi de suite jusqu'à la transaction de niveau haut. Nous nous assurons qu'un xid parent est toujours plus petit que n'importe quel subxid enfants.
Le xid du parent immédiat de chaque subxid est enregistré dans le répertoire
pg_subtrans
. Aucune entrée n'est faite pour les xid de
niveau haut vu qu'ils n'ont pas de parent. Aucune entrée n'est fait pour
les sous-transactions en lecture seule.
Quand une sous-transaction valide, toutes les sous-transactions enfants validées ayant des subxid seront considérées sous-validées dans cette transaction. Quand une sous-transaction annule, toutes les sous-transactions enfants seront aussi considérées comme annulées.
Quand une transaction deniveau haut avec un xid st validé, toutes les
sous-transactions enfants sous-validées sont aussi enregistrées de façon
permanente dans le répertoire pg_xact
comme étant
validées. Si la transaction de niveau haut annule, toutes ses
sous-transactions sont aussi annulées, même si elles étaient sous-validées.
Plus chaque transaction conserve de sous-transactions ouvertes (ni annulées
ni validées), plus importante sera la surcharge du système de gestion des
transactions. Jusqu'à 64 sous-transactions peuvent être placées en cache en
mémoire partagée pour chaque processus serveur. Après cela, la charge des
entrées/sorties disques augmente significativement à cause des recherches
supplémentaires dans les entrées subxid de pg_subtrans
.