SQL Academy · Leçon

Verrouillage optimiste ou pessimiste

Comparez les modèles SELECT ... FOR UPDATE (pessimiste) et colonne de version / WHERE updated_at = ? (optimiste).

Leçon 4 sur 415 étapes

Verrouillage optimiste ou pessimiste est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 4 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 SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Deux stratégies de concurrence

  • Pessimiste — verrouiller la ligne lors de sa lecture : personne d’autre ne peut la modifier
  • Optimiste — ne pas verrouiller : lors de la mise à jour, vérifier que la ligne n’a pas changé

Pessimiste : SELECT ... FOR UPDATE

Verrouillez maintenant, écrivez plus tard :

BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- other transactions cannot lock or update this row
-- compute new balance...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

FOR SHARE

Verrou en lecture — les autres peuvent lire, mais pas écrire :

SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATE

Avantages et inconvénients de l’approche pessimiste

Avantages : simple à comprendre, aucune nouvelle tentative nécessaire.
Inconvénients : réduit la concurrence et peut provoquer des attentes liées aux verrous ainsi que des interblocages.

Optimiste : colonne de version

Lisez avec la version et écrivez avec WHERE version = expected :

BEGIN;
SELECT id, balance, version FROM accounts WHERE id = 1;
-- compute new balance...
UPDATE accounts
   SET balance = ?, version = version + 1
WHERE id = 1 AND version = ?;
-- check rows affected: 0 means someone else updated, retry

Optimiste avec updated_at

Même idée, en utilisant updated_at au lieu d’une colonne de version explicite :

UPDATE accounts
   SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;

-- If updated_at has changed in the meantime, 0 rows affected — retry.

Avantages et inconvénients de l’approche optimiste

Avantages : forte concurrence, aucune attente.
Inconvénients : les écritures peuvent échouer et nécessiter une nouvelle tentative ; le conflit n’apparaît qu’au moment de UPDATE.

Quand choisir l’approche pessimiste

Pour :

  • Les transactions courtes avec une forte contention sur des lignes très sollicitées
  • Les transferts d’argent — vous ne voulez pas de traitement partiel
  • Les opérations de longue durée pour lesquelles un conflit est probable

Quand choisir l’approche optimiste

Pour :

  • Les charges principalement constituées de lectures, avec de rares conflits
  • Les API sans état, où le client conserve la ligne entre les requêtes
  • Les modifications effectuées sur mobile ou hors ligne, suivies d’une synchronisation

Hybride : FOR UPDATE NOWAIT

Essayez de verrouiller ; si la ligne est verrouillée, échouez immédiatement et laissez l’utilisateur réessayer :

SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry message

Verrous consultatifs

Verrous au niveau de l’application, associés à aucune ligne :

SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.

N’oubliez pas d’indexer les cibles des verrous

FOR UPDATE sans index sur la colonne utilisée dans WHERE peut verrouiller plus de lignes que prévu (il verrouille les lignes parcourues, et pas seulement celles qui correspondent).

Délais d’attente des verrous

Définissez lock_timeout pour éviter d’attendre indéfiniment :

SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 seconds

Récapitulatif

L’approche pessimiste verrouille la ligne ; l’approche optimiste vérifie au moment de l’écriture.

  • Pessimiste : FOR UPDATE — simple, mais réduit la concurrence
  • Optimiste : colonne de version — davantage de concurrence, mais nécessite une nouvelle tentative
  • Choisissez selon la charge de travail ; combinez les approches si nécessaire

Vérification rapide

La décrémentation d’un stock de commerce en ligne est très disputée. Quelle stratégie de verrouillage est généralement la plus sûre ?

Gratuit pour commencer

Apprends SQL avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
46
Leçons
183

Questions Fréquemment Posées

La leçon « Verrouillage optimiste ou pessimiste » est-elle gratuite ?

Oui — le texte complet de « Verrouillage optimiste ou pessimiste » 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 SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Verrouillage optimiste ou pessimiste » ?

Comparez les modèles SELECT ... FOR UPDATE (pessimiste) et colonne de version / WHERE updated_at = ? (optimiste). Tu pratiques SQL Academy 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 SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy 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 4 sur 4.

Combien de temps prend la leçon « Verrouillage optimiste ou pessimiste » ?

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 SQL Academy ?

Oui. Chaque leçon SQL Academy 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

  1. Propriétés ACID et anomalies
  2. Niveaux d’isolation : READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Interblocages : détection et prévention
  4. Verrouillage optimiste ou pessimiste
← Retour à SQL Academy