</>
Plan du cours — 31/64

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 SELECT n'attend jamais un UPDATE.
  • Un UPDATE produit une nouvelle version de ligne ; l'ancienne devient une ligne morte (« dead tuple ») une fois qu'aucune transaction ne peut plus la voir.
  • Le VACUUM ré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 VACUUM de nettoyer toutes les versions apparues depuis son début : la table et ses index gonflent (« bloat ») et les requêtes ralentissent. Surveillez pg_stat_activity pour repérer les vieilles transactions.