Niveaux d’isolation des transactions
Quels sont les niveaux d’isolation des transactions dans PostgreSQL ?
Le niveau d’isolation détermine ce qu’une transaction voit des modifications des transactions concurrentes. PostgreSQL utilise Read Committed par défaut et propose aussi Repeatable Read et Serializable.
Le standard SQL définit quatre niveaux d’isolation selon les anomalies qu’ils autorisent : lectures sales, lectures non reproductibles, lectures fantômes et anomalies de sérialisation. PostgreSQL accepte les quatre noms de niveaux, mais Read Uncommitted se comporte comme Read Committed ; en pratique, il y en a donc trois : Read Committed, Repeatable Read et Serializable.
Read Committed, le niveau par défaut, donne à chaque instruction un nouvel instantané : deux requêtes d’une même transaction peuvent donc voir des données différentes. Repeatable Read utilise un seul instantané pour toute la transaction. Serializable ajoute des vérifications pour que les transactions concurrentes se comportent comme si elles s’étaient exécutées l’une après l’autre. Aux deux niveaux les plus stricts, une transaction peut échouer avec une erreur de sérialisation, et l’application doit alors la relancer.
Exemple
L’exemple affiche le niveau par défaut du serveur, puis démarre une transaction Repeatable Read et le confirme avec SHOW transaction_isolation. Toutes les lectures de cette transaction utilisent le même instantané.
CREATE TABLE stock (sku text PRIMARY KEY, qty int);
INSERT INTO stock VALUES ('A-1', 5);
SHOW default_transaction_isolation;
BEGIN ISOLATION LEVEL REPEATABLE READ;
SHOW transaction_isolation;
SELECT qty FROM stock WHERE sku = 'A-1';
COMMIT;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).