Pour une raison quelconque, je pensais que la transaction implicite entityManager joins était une nouvelle transaction. Mais Documents Hibernate state :"Lorsque vous créez un gestionnaire d'entités dans une transaction, le gestionnaire d'entités rejoint automatiquement la transaction en cours."
Donc, apparemment, il y a une autre transaction déjà en cours d'exécution (pas surprenant) et mes résultats de récupération changent en fonction de ce qu'il a déjà lu (car la base de données fonctionne en mode REPEATABLE-READ.)
À court terme, je balayerai mon code pour explicitement commencer () les transactions partout où cela manque. À plus long terme, j'examinerai Spring Transactions pour voir comment gérer les transactions de manière plus infaillible (comme cela a été suggéré dans les commentaires.)