@Transactional délimite une transaction autour d'une méthode : si elle se termine normalement, les changements sont validés ; en cas d'exception non vérifiée (RuntimeException), ils sont annulés. On l'applique sur la couche service. readOnly = true signale les lectures, et l'appel interne à une méthode de la même classe contourne le proxy.
Exemple
@Transactional
void virer(long de, long vers, double m) {...}