Lectures sales, non répétables et fantômes
Les trois anomalies de lecture et le niveau d’isolation qui empêche chacune d’elles
Lectures sales, non répétables et fantômes est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.
Les trois anomalies de lecture
Les niveaux d'isolation existent pour empêcher des bogues de concurrence précis appelés anomalies de lecture. Les recruteurs s'attendent à ce que vous définissiez les trois avec précision et associiez chacune au niveau qui l'empêche.
- Lecture sale - lecture de données non validées
- Lecture non répétable - une ligne change entre deux lectures
- Lecture fantôme - de nouvelles lignes apparaissent entre deux lectures
La difficulté consiste à distinguer la lecture non répétable de la lecture fantôme, car toutes deux impliquent de relancer une requête et d'obtenir des résultats différents.
Lecture sale : définition
Une lecture sale se produit lorsque la transaction T1 lit une ligne que la transaction T2 a modifiée, mais pas encore validée. Si T2 annule ensuite ses modifications, T1 a pris une décision à partir de données qui n'ont jamais réellement existé.
Seul READ UNCOMMITTED autorise les lectures sales. Tous les niveaux supérieurs les interdisent.
Danger dans le monde réel : approuver un prêt sur la base d'un dépôt qui est annulé quelques secondes plus tard.
Lecture sale : chronologie
Lisez les deux colonnes comme une chronologie. T1 s'exécute au niveau READ UNCOMMITTED.
T1 voit un solde de 700, mais T2 ne valide jamais ses modifications. Le montant de 700 était un fantôme du travail en cours de T2. Après l'annulation de T2, la valeur réelle est toujours de 500. T1 a pris une décision à partir de données erronées.
-- T2 (not committed) | -- T1 (READ UNCOMMITTED)
BEGIN; |
UPDATE accounts |
SET balance = 700 |
WHERE id = 1; |
| SELECT balance FROM accounts
| WHERE id = 1; -- reads 700 (dirty!)
ROLLBACK; |
| -- T1 acted on a value that never existedLecture non répétable : définition
Une lecture non répétable se produit lorsque T1 lit une ligne, que T2 valide une mise à jour ou une suppression de cette même ligne, puis que T1 la relit et constate une valeur différente.
Remarquez la différence essentielle avec une lecture sale : ici, T2 a validé ses modifications. Les données sont réelles, mais elles ont changé sous les yeux de T1 au cours d'une seule transaction.
READ COMMITTED autorise toujours ce phénomène. REPEATABLE READ et les niveaux supérieurs l'empêchent en lisant un instantané stable.
Lecture non répétable : chronologie
T1 s'exécute au niveau READ COMMITTED et lit deux fois la même ligne. Entre les deux lectures, T2 valide une modification.
La même clé primaire renvoie deux valeurs différentes au sein d'une seule transaction. Cette incohérence peut perturber une logique en plusieurs étapes qui suppose que la ligne reste stable.
-- T1 (READ COMMITTED) | -- T2
BEGIN; |
SELECT balance FROM accounts |
WHERE id = 1; -- 500 |
| BEGIN;
| UPDATE accounts SET balance = 900
| WHERE id = 1;
| COMMIT;
SELECT balance FROM accounts |
WHERE id = 1; -- 900 (changed!) |
COMMIT; |Lecture fantôme : définition
Une lecture fantôme se produit lorsque T1 exécute une requête avec une condition de recherche, que T2 valide un INSERT (ou un DELETE) de lignes correspondant à cette condition, puis que T1 réexécute la requête et voit un ensemble de lignes différent.
La différence avec une lecture non répétable est la suivante : une lecture non répétable concerne la modification de la valeur d'une ligne existante ; une lecture fantôme concerne la modification du nombre de lignes correspondant à un prédicat.
Seul SERIALIZABLE garantit, selon la norme, d'empêcher les lectures fantômes.
Lecture fantôme : chronologie
T1 compte deux fois les comptes à valeur élevée. Entre les deux comptages, T2 insère une nouvelle ligne correspondante et valide la transaction.
Aucune ligne existante n'a changé, et pourtant le COUNT est différent. La nouvelle ligne est le « fantôme » apparu dans l'ensemble de résultats de T1.
-- T1 (REPEATABLE READ, standard) | -- T2
BEGIN; |
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 3 |
| INSERT INTO accounts(id, balance)
| VALUES (99, 5000);
| COMMIT;
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 4 (phantom)|
COMMIT; |Associer les anomalies aux niveaux
Cette correspondance est au cœur du sujet. Voici le niveau le plus bas qui empêche chaque anomalie :
- Lecture sale empêchée à partir de
READ COMMITTED. - Lecture non répétable empêchée à partir de
REPEATABLE READ. - Lecture fantôme empêchée par
SERIALIZABLE(selon la norme).
Remarquez que les noms correspondent : REPEATABLE READ rend les lectures répétables ; les niveaux portent le nom de l'anomalie qu'ils permettent nouvellement d'empêcher.
Lecture non répétable ou fantôme : la distinction essentielle
C'est la confusion la plus fréquente en entretien. Retenez cette phrase :
Lecture non répétable = la valeur d'une ligne existante a changé. Lecture fantôme = l'ensemble des lignes correspondantes a changé (des lignes ont été ajoutées ou supprimées).
Vérifiez votre compréhension : T2 exécute UPDATE ... WHERE id = 5, puis valide, et T1 relit la ligne 5. Il s'agit d'une lecture non répétable. T2 exécute un INSERT pour ajouter une nouvelle ligne correspondant au WHERE de T1, puis T1 réexécute la requête. Il s'agit d'une lecture fantôme.
Décalage d'écriture : l'anomalie supplémentaire
Lors d'entretiens avancés, on peut aller au-delà des trois anomalies classiques et aborder le décalage d'écriture : deux transactions lisent chacune un ensemble qui se chevauche, effectuent des écritures distinctes en fonction de ce qu'elles ont lu, puis valident toutes les deux, laissant un état qu'aucune n'aurait autorisé seule.
Exemple classique : deux médecins sont de garde ; chacun vérifie qu'un autre médecin est de garde, puis se retire lui-même de la garde. Les deux réussissent, et il ne reste plus aucune couverture.
L'isolation par instantané (REPEATABLE READ de Postgres) autorise le décalage d'écriture ; seul SERIALIZABLE l'empêche. Le mentionner montre que vous maîtrisez le sujet en profondeur.
Mise à jour perdue : le quatrième piège
Les recruteurs glissent parfois la notion de mise à jour perdue, qui ne figure pas dans la liste des anomalies de la norme, mais qui survient constamment en pratique. Deux transactions lisent la même valeur, calculent toutes deux une nouvelle valeur à partir de celle-ci, puis l'écrivent. La seconde écriture écrase silencieusement la première.
Exemple : deux virements lisent chacun un solde de 500, soustraient chacun un montant, puis écrivent leur résultat. Une des soustractions est perdue.
La solution ne consiste pas seulement à choisir un niveau d'isolation supérieur, mais à utiliser un verrouillage explicite avec SELECT ... FOR UPDATE, ou une mise à jour atomique qui effectue le calcul dans la base de données plutôt que dans l'application.
-- Safe pattern: lock the row, or compute atomically
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- locks row
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Or simply: UPDATE accounts SET balance = balance - 100 WHERE id = 1;Vérification rapide
Identifiez l'anomalie à partir de son comportement.
Récapitulatif : anomalies et remèdes
Trois anomalies de lecture, chacune corrigée par un niveau d'isolation supérieur :
- Lecture sale (données non validées) - corrigée au niveau READ COMMITTED.
- Lecture non répétable (la valeur d'une ligne existante change) - corrigée au niveau REPEATABLE READ.
- Lecture fantôme (l'ensemble des lignes correspondantes change) - corrigée au niveau SERIALIZABLE.
Gardez bien la distinction entre lecture non répétable et lecture fantôme, et mentionnez le décalage d'écriture si le recruteur souhaite aller plus loin. Nous allons maintenant voir comment les moteurs imposent réellement l'isolation : verrouillage, interblocages et MVCC.
Questions Fréquemment Posées
La leçon « Lectures sales, non répétables et fantômes » est-elle gratuite ?
Oui — le texte complet de « Lectures sales, non répétables et fantômes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Lectures sales, non répétables et fantômes » ?
Les trois anomalies de lecture et le niveau d’isolation qui empêche chacune d’elles Tu pratiques Coding Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Coding Interview Prep ?
Aucune expérience préalable n'est requise. Coding Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Lectures sales, non répétables et fantômes » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Coding Interview Prep ?
Oui. Chaque leçon Coding Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Les propriétés ACID expliquées
- Les quatre niveaux d’isolation
- Lectures sales, non répétables et fantômes
- Interblocages, verrous et MVCC