Sí, es posible usar @Transactional en métodos privados, pero como otros han mencionado, esto no funcionará de inmediato. Necesitas usar AspectJ. Me tomó un tiempo descubrir cómo hacerlo funcionar. Compartiré mis resultados.
Elegí usar el tejido en tiempo de compilación en lugar del tejido en tiempo de carga porque creo que es una mejor opción en general. Además, estoy usando Java 8, por lo que es posible que deba ajustar algunos parámetros.
Primero, agregue la dependencia para Aspectjrt.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
Luego agregue el complemento AspectJ para hacer el tejido de código de bytes real en Maven (esto puede no ser un ejemplo 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>
Finalmente agregue esto a su clase de configuración
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
Ahora debería poder usar @Transactional en métodos privados.
Una advertencia para este enfoque: necesitará configurar su IDE para conocer AspectJ; de lo contrario, si ejecuta la aplicación a través de Eclipse, por ejemplo, puede que no funcione. Asegúrate de probar contra una construcción directa de Maven como un control de cordura.