MVCC : lire sans bloquer
AvancéPostgreSQL utilise le MVCC (Multi-Version Concurrency Control) : une modification ne réécrit pas la ligne, elle en crée une nouvelle version, et chaque transaction voit la version qui correspond à son instantané.
Conséquences#
- Les lecteurs ne bloquent pas les écrivains, et inversement : un
SELECTn'attend jamais unUPDATE. - Un
UPDATEproduit une nouvelle version de ligne ; l'ancienne devient une ligne morte (« dead tuple ») une fois qu'aucune transaction ne peut plus la voir. - Le
VACUUMrécupère l'espace des lignes mortes pour le réutiliser ; l'autovacuum s'en charge en tâche de fond. - Chaque version porte des identifiants de transaction (
xmin,xmax) qui décident de sa visibilité.
SELECT xmin, xmax, * FROM comptes WHERE id = 1; -- visible : ces colonnes système existent
Piège : une transaction très longue (rapport, connexion oubliée) empêche
VACUUMde nettoyer toutes les versions apparues depuis son début : la table et ses index gonflent (« bloat ») et les requêtes ralentissent. Surveillezpg_stat_activitypour repérer les vieilles transactions.