Comprendre le contrôle d’accès concurrentiel multi-version (MVCC) et les instantanés

Effectué

La plupart des systèmes de gestion de base de données (SGBD) utilisent des verrous pour appliquer le contrôle d’accès concurrentiel, mais PostgreSQL complète le verrouillage avec une autre approche. PostgreSQL utilise un système appelé « contrôle d’accès concurrentiel multi-version (MVCC) » qui permet à plusieurs versions de la même ligne d’exister pour améliorer l’accès concurrentiel. Avec ce système, chaque requête voit un précédent instantané des données qui sont cohérentes au niveau transactionnel. MVCC certifie qu’une transaction qui est en train de lire des données ne bloque pas une transaction qui est en train d’écrire des données, et inversement.

Par exemple, une Connexion A effectue une requête qui analyse toutes les lignes d’une table. Au même moment, une Connexion B effectue une requête qui met à jour certaines des lignes. MVCC permet aux deux requêtes de s’exécuter en même temps en créant une autre version des lignes affectées. Ainsi, la Connexion B peut effectuer les mises à jour sans affecter la Connexion A. Ce processus est obtenu car chaque version de ligne a une valeur xmin pour la transaction visible depuis et une valeur xmax pour la transaction visible jusqu’à. Avec MVCC, la connexion A ignore toutes les modifications qui se sont produites après le démarrage de la requête de la Connexion A.

Diagramme du contrôle concurrentiel multi-version montrant une requête de lecture lisant les données d’origine et une requête d’écriture mettant à jour un instantané.

Transactions

Dans un système SGBD, les transactions sont une unité atomique de travail. Par conséquent, la transaction est validée dans son intégralité ou pas du tout. Les transactions sont également utilisées à des fins d’accès concurrentiel. Avec les niveaux d’isolation, il est possible de définir l’effet qu’une transaction peut avoir sur d’autres transactions simultanées.

Vous démarrez une transaction avec une instruction BEGIN TRANSACTION ou START TRANSACTION. Vous exécutez une transaction avec COMMIT, pour enregistrer toutes les modifications apportées dans la transaction, ou avec ROLLBACK, pour annuler toute modification apportée par la transaction. Par exemple :

BEGIN TRANSACTION;
    UPDATE production.workorder
        SET stockedqty=7
        WHERE workorderid=1;
COMMIT;