Each DataSource needs its own PlatformTransactionManager, selected by name in @Transactional, and a single @Transactional cannot atomically span two independent databases without JTA/XA.
Spring Boot uses CGLIB proxies by default which read annotations from the concrete class, so placing @Transactional on the implementation is the only placement that works reliably for both CGLIB and JDK proxy types.