¿Cómo configurar la gestión de transacciones para trabajar con 2 db diferentes en Spring?

Tengo 2 bases de datos (MySql y HSQLDB). Configuré 2 fonts de datos y 2 beans EntityManagerFactory. También puedo configurar 2 beans JpaTransactionManager correspondientes.

Pero no sé cómo especificar cuál de ellos se debe usar para administrar transacciones para una clase de servicio concreta. Quiero utilizar la anotación @Transactional para ese propósito, pero en realidad solo puedo especificar uno de los txManagers:

  

¿Cuál es la salida de esta situación?

El javadoc para JpaTransactionManager tiene algunos consejos sobre esto:

Este administrador de transacciones es apropiado para aplicaciones que usan una única JPA EntityManagerFactory para el acceso a datos transaccionales. JTA (generalmente a través de JtaTransactionManager) es necesario para acceder a múltiples recursos transaccionales dentro de la misma transacción. Tenga en cuenta que debe configurar su proveedor de JPA en consecuencia para que participe en las transacciones de JTA.

En otras palabras, si se encuentra con múltiples administradores de entidades, con los gerentes de tx correspondientes, entonces debería considerar usar un solo JtaTransactionManager en JtaTransactionManager lugar. Los gerentes de la entidad deberían poder participar en las transacciones de JTA, y esto le dará total transaccionalidad entre los dos gerentes de la entidad, sin tener que preocuparse por en qué administrador de entidades se encuentra en un momento dado.

Por supuesto, JtaTransactionManager requiere un servidor de aplicaciones compatible con JTA completo, en lugar de un motor de servlets estándar como Tomcat.

Declare su atributo sin transaction-manager , declare los calificadores para los gerentes de transacción de la siguiente manera:

     

Utilice este calificador en @Transactional como valor para seleccionar uno de los gerentes de transacción:

 @Transactional("txManager1") 

O, con más propiedades:

 @Transactional(value = "txManager1", readOnly = true) 

Dado que es después de un largo tiempo desde las respuestas correctas.

Skaffman puede ser correcto en términos de usabilidad de JpaTransactionManager para múltiples bases de datos.

Pero hay una solución de trabajo para usar 2 bases de datos diferentes con 2 JpaTransactionManager diferentes.

  @Bean(name = "db2TransactionManager") public PlatformTransactionManager transactionManager2() throws NamingException { JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory()); return txManager; } @Bean @Primary public PlatformTransactionManager transactionManager() throws Exception { JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory()); txManager.setNestedTransactionAllowed(true); return txManager; } 

@Primary debe utilizar para especificar aquellos en los que no especifica el nombre de calificador en @Transactional

Debe especificar dos gestores de transacciones para eso en application-context.xml de la siguiente manera:

   

El atributo @Transactional ahora usará su correspondiente administrador de transacciones.