Namaste ! Je suis en train de lire un cours sur mysql.
Je viens de finir le chapitre sur l'isolation. Je pensais avoir compris la différence entre les niveaux repeatable read et read commited et pourtant en faisant des tests je n'obtiens aucune différence.
Ce que je pense avoir compris : En mode repeatable read (activé par défaut) je suis censé obtenir toujours le même résultat si je fais un select sur une ligne et qu'une autre session la modifie.
En mode committed read, je suis censé obtenir le dernier résultat committé.
J'ai donc fait des tests avec deux sessions sur mysql workbench, et en mode repeatable read j'obtiens le dernier résultat commité.
Exemple j'ouvre deux sessions en même temps et je suis en mode repeatable read:
table bateau:
id=5 nom='yacht'
Session 1: selectionne cette ligne j'obtiens ce résultat.
Session 2: start transaction; update bateau set nom='barque' where id=5; commit;
Session 1: je select à nouveau cette ligne et j'obtiens 'barque'.
Pourquoi est-ce que j'obtiens bien la nouvelle valeur et pas yacht ?
Si je me mets en mode committed read, j'obtiens évidemment la même chose et je ne vois donc aucune différence entre ces modes.
J'ai voulu essayer le mode uncommited read pour vérifier que le changement de niveau d'isolation est bien pris en compte. J'ai donc fais un test un updatant une valeur sans la commit, et j'obtiens bien la valeur non commit sur l'autre session quand je fais un select, donc il n'y a pas de problème à ce niveau.
J'ai fait un autre test en mode commited read: J'ai update une ligne sur la session 1 sans la commit. Et je l'ai selectionné sur la session 2 et ça me donne la valeur initiale. Logique donc puisque ça n'est pas commit, mais je pensais que comme ça cherchait les dernières valeurs, le query n'allait rien me retourner tant que je n'aurais pas commit sur la session 1, un peu comme lors d'un SELECT LOCK in SHARE MODE sur une ligne en update mais encore committ par une autre sessions. Mais non ça se comporte exactement de la même manière qu'en repeatable read.
Quelle est donc la différence entre ces deux niveaux d'isolation.
J'en profite pour poser une autre question purement théorique: sur un site web type réseau social qui aurait environ 5 millions de visiteurs quotidiens, et qui comporte des tables de plusieurs plusieurs millions de lignes, un SELECT LOCK in SHARE MODE ne risque il pas considérablement ralentir le traffic ? Par exemple si une célébrité qui a des centaines de milliers de followers édite un post sur son mur d'actualité (cela se ferait dans une transaction UPDATE) et qu'au même moment des centaines d'utilisateurs aterrissent sur sa page ou l'actualisent (Il y aurait donc un select lock in share mode) si pour une raison quelconque l'update du posts prends du temps alors il ne s'afficherait pas chez les utilisateurs. Ne vaudrait il pas mieux avoir le post initial plutôt que d'attendre. Ou pire la situation inverse: la célébrité veut éditer son posts au moment ou des millions d'autres sessions font un select lock in share mode dessus (ce qui interdit l'écriture tant que c'est pas commit), l'edit de son post risque de prendre beaucoup de temps s'il faut que des milliers de commit soient effectués avant, ça risque même de n'être jamais effectué à cause d'un timeout si la transaction est bloquée trop lontemps.
Quel est votre point de vue à ce sujet ?
Et enfin dernière question: Si une session Update une ligne avec transaction puis committ. Et qu'une autre sessions fait un SELECT classique (donc sans lock in share mode) exactement au moment du commit de l'update. Est il possible que le select renvoie une ligne composée des anciennes et des nouvelles données ?
Par exemple l'entrée initiale est id=3 animal='lapin' nom='bugs bunny' et l'update set animal='canard' nom='daffy duck'
Le SELECT pourrait il renvoyer id=3 animal='canard' nom='bugs bunny' ? La "photographie initiale" de la ligne est prise par quelle session, celle qui fait le SELECT ou celle qui fait l'update ? Si c'est celle qui fait le select comment peut elle photographier une ligne qui en cours de committ ?
Voilà désolé pour le pavé mais je me prends la tête avec ça depuis hier.
Partager