Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 6 · Application directe du cours
Une transaction en lecture seule
Relations et transactions · niveau 2
Énoncé
Une méthode @Transactional(readOnly = true) charge un livre et vide son stock par retirerDuStock. Le stock est-il modifié en base ? Expliquer, puis vérifier par un test.
Corrigé
Non. Avec readOnly = true, Spring passe la session Hibernate en mode de vidage manuel : à la fin de la transaction, Hibernate ne compare pas les entités à leur copie et n'écrit rien. La modification reste en mémoire, puis disparaît avec la session.
@Transactional(readOnly = true)
public int compterEtVider(String isbn) {
var livre = livres.findById(isbn).orElseThrow();
int stock = livre.getStock();
livre.retirerDuStock(stock); // modification… dans une transaction en lecture seule
return stock;
}
void ex7_lectureSeule() {
assertThat(inventaire.compterEtVider(PRINCE)).isEqualTo(25);
// rien n'a été écrit
assertThat(livres.findById(PRINCE).orElseThrow().getStock()).isEqualTo(25);
}
C'est un filet de sécurité commode, mais pas un contrôle : une méthode en lecture seule qui modifie une entité est une erreur de conception.
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.