Comprendre le contrôle d’accès concurrentiel multi-version (MVCC) et les instantanés
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 concurrentiel multiversion (MVCC) qui permet à plusieurs versions de la même ligne d’exister pour améliorer la concurrence. Avec ce système, chaque requête voit un précédent instantané des données qui sont cohérentes au niveau transactionnel. MVCC garantit qu’une transaction qui lit les données ne bloque pas une transaction qui écrit des données et inversement.
Par exemple, la connexion A effectue une requête qui analyse toutes les lignes d’une table. En même temps, la 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. De cette façon, la connexion B peut effectuer les mises à jour sans affecter la connexion A. Ce processus est réalisé car chaque version de ligne possède une valeur xmin pour la transaction visible depuis et une valeur xmax pour la transaction visible jusqu'à. Avec MVCC, la connexion A ignore les modifications qui se sont produites après le démarrage de la requête Connexion A.

Opérations
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 de concurrence. Avec les niveaux d’isolation, l’effet qu’une transaction peut avoir sur d’autres transactions simultanées peut être définie.
Vous démarrez une transaction avec BEGIN TRANSACTION ou START TRANSACTION. Vous effectuez une transaction avec COMMIT, pour enregistrer toutes les modifications apportées dans la transaction, ou ROLLBACK, pour annuler toutes les modifications apportées par la transaction. Par exemple:
BEGIN TRANSACTION;
UPDATE production.workorder
SET stockedqty=7
WHERE workorderid=1;
COMMIT;