Sim, é possível usar o @Transactional em métodos privados, mas, como outros usuários mencionaram, isso não funcionará imediatamente. Você precisa usar o AspectJ. Levei algum tempo para descobrir como fazê-lo funcionar. Vou compartilhar meus resultados.
Eu escolhi usar a tecelagem em tempo de compilação em vez da tecelagem em tempo de carga porque acho que é uma opção melhor em geral. Além disso, estou usando o Java 8, portanto, pode ser necessário ajustar alguns parâmetros.
Primeiro, adicione a dependência para aspectjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Em seguida, adicione o plug-in AspectJ para fazer a tecelagem de bytecode real no Maven (este pode não ser um exemplo mínimo).
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
Por fim, adicione isso à sua classe de configuração
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Agora você deve poder usar o @Transactional em métodos privados.
Uma ressalva a esta abordagem: você precisará configurar seu IDE para conhecer o AspectJ, caso contrário, se você executar o aplicativo via Eclipse, por exemplo, ele poderá não funcionar. Teste contra uma compilação direta do Maven como uma verificação de sanidade.