Если вы не используете переплетение кода, это не может работать.
По умолчанию Spring обрабатывает транзакции через AOP-прокси . Вызов транзакционного метода выглядит следующим образом:
caller --> ProxyClass.a() --> YourClass.a()
Если вы вызываете другой метод для того же объекта, вы не проходите через прокси-сервер, поэтому нет транзакционного поведения.
caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()
Если вы не хотите использовать AspectJ, вы можете получить прокси-объект, используя AopContext.currentProxy()
.