Passer au contenu principal
eLearner.app
Module 11 · Leçon 4 sur 444/57 dans le cours~12 min
Leçons du module (4/4)

Niveaux d'isolement

Au-delà des FOR UPDATE explicites, les transactions ont également des règles mathématiques innées profondément ancrées dans le moteur qui régissent la quantité d'énergie à dépenser pour isoler chaque interaction individuelle par défaut. C'est ce qu'on appelle le niveau d'isolement. Dans le monde SQL on en connaît 4 standards, par ordre de puissance et de sécurité mais évidemment l'inverse en termes de performances.

  • READ UNCOMMITTED: Folie anarchique, votre transaction verra toutes les modifications apportées par d'autres y compris les données temporaires des personnes à mi-chemin de leurs propres scripts. Personne ne l'utilise sur de grandes bases de données, en raison d'erreurs constantes de Dirty Read.
  • READ COMMITTED: (par défaut pour Postgres). Vous verrez instantanément de nouvelles données dès qu'un tiers émet un COMMIT, mais vous pouvez être victime de lectures fantômes (voir de nouveaux enregistrements au milieu de vos longs flux de travail) ou d'une vue cohérente non linéaire.
  • REPEATABLE READ: Plus lourd. Pendant toute la durée de votre grande session de fenêtre temporelle, je "vois" la base de données gelée au moment où ma requête a commencé, ignorant totalement et ne tenant même pas compte des validations officielles effectuées par d'autres personnes ! Il protège contre l’apparition magique des enregistrements, garantissant ainsi la stabilité.
  • Niveau Dieu SERIALIZABLE: (Super lent). Traite chaque transaction qui se chevauche en les bloquant et en les exécutant en série en ligne sur une seule voie, en abandonnant impitoyablement celles qui entrent en collision, éliminant à la racine même la possibilité scientifique de la moindre collision, sacrifiant ainsi 90 % du débit élevé.

Comment le paramétrer ?

Au lieu du BEGIN; normal, vous tapez :

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

Ou dans certaines variantes et moteurs plus anciens, vous l'attribuez après le démarrage :

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Essayez-le vous-même

Exercice#sql.m11.l4.e1
Tentatives : 0Chargement…

Démarrez une transaction en définissant formellement le niveau global pour la durée de vie de la requête sur REPEATABLE READ pour créer un échange gelé et protégé. N'oubliez pas qu'au niveau de la requête, cela ne sert à rien à moins d'être suivi par autre chose, alors fermez-le vide avec 'COMMIT'.

Chargement de l'éditeur…
Afficher l'indice

Ouvrir avec COMMENCER LA LECTURE RÉPÉTABLE DU NIVEAU D'ISOLATION ; et fermez avec COMMIT ;

Solution disponible après 3 tentatives

Exercice#sql.m11.l4.e2
Tentatives : 0Chargement…

Essayons le niveau sérialisable fou et insérons des données fictives. Ouvrez un bloc 'SERIALIZABLE'. Mettez à jour le nom de la catégorie Id=2 en 'Nuovo Nome Segreto'. Exécutez le commit atomique final et réglé.

Chargement de l'éditeur…
Afficher l'indice

COMMENCER LE NIVEAU D'ISOLATION SÉRIALISABLE ; MISE À JOUR des catégories SET name = 'Nuovo Nome Segreto' WHERE id = 2; COMMIT;

Solution disponible après 3 tentatives