Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →