Tous les termes du glossaire

Contrôle de concurrence multiversion (MVCC)

Qu’est-ce que le MVCC dans PostgreSQL ?

Le MVCC permet aux lectures et aux écritures de s’exécuter en même temps : chaque instruction voit un instantané des données, et les mises à jour écrivent de nouvelles versions de lignes au lieu d’écraser les lignes en place.

Le contrôle de concurrence multiversion (MVCC) est la façon dont PostgreSQL maintient la cohérence des transactions concurrentes sans les faire attendre les unes les autres. Chaque instruction voit un instantané des données tel qu’il était à un instant donné : la lecture ne bloque donc jamais l’écriture, et l’écriture ne bloque jamais la lecture.

En interne, un UPDATE écrit une nouvelle version de la ligne et marque l’ancienne comme expirée. Les colonnes système cachées xmin et xmax enregistrent quelles transactions ont créé et fait expirer chaque version. Les anciennes versions restent dans la table jusqu’à ce que VACUUM les retire, ce qui explique que des transactions très longues puissent faire grossir les tables.

Exemple

L’exemple lit la colonne cachée xmin avant et après un UPDATE. La valeur change, car la mise à jour a écrit une nouvelle version de la ligne portant l’ID de la transaction qui l’a effectuée.

CREATE TABLE accounts (id int PRIMARY KEY, balance int);
INSERT INTO accounts VALUES (1, 100);
SELECT xmin, xmax, * FROM accounts;

UPDATE accounts SET balance = 90 WHERE id = 1;
SELECT xmin, xmax, * FROM accounts;

Du SQL simple pour PostgreSQL 16 ou 17 standard, sans aucune extension. Exécutez-le dans une base de données vide que vous pouvez jeter ensuite.

Références

Documentation officielle de PostgreSQL (en anglais).

Termes associés