Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 12 · Application directe du cours
Huit clients, trois exemplaires
Projet : l'API de la Librairie · niveau 3 (difficile)
Énoncé
Expliquer, sur un exemple de deux transactions et en donnant la valeur du stock lue et écrite par chacune, comment le code du chapitre 11 a pu accepter huit commandes et finir avec un stock de 2. Expliquer ensuite pourquoi le verrou posé dans la boucle de commander ne suffisait pas.
Corrigé
Sans verrou, deux transactions A et B :
- A lit le livre : stock 3. B lit le livre : stock 3.
- A vérifie (), retire un exemplaire en mémoire (2), enregistre sa commande et écrit
stock = 2. Validation. - B vérifie (, d'après sa lecture), calcule 2, enregistre sa commande et écrit
stock = 2. Validation.
Deux commandes, un seul exemplaire retiré : la mise à jour de A est perdue. Avec huit transactions qui partent toutes de la même lecture, toutes passent la vérification, chacune écrit 2 : huit commandes, stock final 2. (Hibernate écrit la valeur calculée en Java, update livre set … stock=?, pas stock = stock - 1.)
Avec le verrou dans la boucle seulement, les transactions attendent bien leur tour pour la seconde lecture ; mais verifier a déjà chargé le livre sans verrou, au début. Hibernate garde une seule instance par ligne dans le contexte de persistance : la lecture verrouillée, une fois son tour venu, lui rend l'objet déjà chargé, avec le stock 3 d'avant l'attente. Chaque transaction calcule donc encore 3 − 1 = 2. En verrouillant dès la première lecture, la transaction attend avant de charger le livre, et lit la valeur laissée par la précédente.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.