Vous pouvez les mettre sur l'interface, mais sachez que les transactions peuvent ne pas se produire dans certains cas. Voir le deuxième conseil dans la section 10.5.6 de la documentation Spring:
Spring vous recommande d'annoter uniquement les classes concrètes (et les méthodes des classes concrètes) avec l'annotation @Transactional, par opposition aux interfaces d'annotation. Vous pouvez certainement placer l'annotation @Transactional sur une interface (ou une méthode d'interface), mais cela ne fonctionne que comme vous vous y attendriez si vous utilisez des proxys basés sur l'interface. Le fait que les annotations Java ne soient pas héritées des interfaces signifie que si vous utilisez des proxys basés sur les classes (proxy-target-class = "true") ou l'aspect basé sur le tissage (mode = "aspectj"), les paramètres de transaction sont non reconnu par l'infrastructure de proxy et de tissage, et l'objet ne sera pas enveloppé dans un proxy transactionnel, ce qui serait décidément mauvais.
Je recommanderais de les mettre sur la mise en œuvre pour cette raison.
De plus, pour moi, les transactions semblent être un détail d'implémentation et doivent donc être dans la classe d'implémentation. Imaginez avoir des implémentations wrapper pour la journalisation ou des implémentations de test (mocks) qui n'ont pas besoin d'être transactionnelles.