En uncómo configurar mutliple administradores de transacciones con Spring + + DBUnit JUnit
Mi línea de comandos copias de aplicaciones Java datos de resumen de una fuente de datos a otro sin usar XA. He configurado dos fuentes de datos separadas y me gustaría una prueba JUnit que pueda retrotraer datos en ambos orígenes de datos. Yo uso DBUnit para cargar datos en la base de datos "fuente", pero no puedo hacer que esto se revierta. Puedo hacer que el origen de datos "objetivo" se revierte.
Mi Código
Dada esta configuración ...
<tx:annotation-driven />
<!-- note the default transactionManager name on this one -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceA" />
</bean>
<bean id="transactionManagerTarget" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceB" />
</bean>
y este código ...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:resources/spring-context.xml",
"classpath:resources/spring-db.xml"})
@Transactional
@TransactionConfiguration(transactionManager = "transactionManagerTarget", defaultRollback = true)
public class MyIntegrationTest {
@Autowired
private MyService service;
@Autowired
@Qualifier("dataSourceA")
private DataSource dataSourceA;
private IDataSet loadedDataSet;
/**
* Required by DbUnit
*/
@Before
public void setUp() throws Exception {
SybaseInsertIdentityOperation.TRUNCATE_TABLE.execute(getConnection(), getDataSet());
SybaseInsertIdentityOperation.INSERT.execute(getConnection(), getDataSet());
}
/**
* Required by DbUnit
*/
protected IDataSet getDataSet() throws Exception {
loadedDataSet = DbUnitHelper.getDataSetFromFile(getConnection(), "TestData.xml");
return loadedDataSet;
}
/**
* Required by DbUnit
*/
protected IDatabaseConnection getConnection() throws Exception{
return new DatabaseConnection(dataSourceA.getConnection());
}
@Test
public void testSomething() {
// service.doCopyStuff();
}
}
El problema que yo veo, es que sólo los Estados @TransactionConfiguration
el origen de datos objetivo para permitir una reversión. DBUnit se está pasando dataSourceA
explícitamente y está recogiendo el gestor de transacciones predeterminado llamado transactionManager
(no estoy seguro de cómo) que no se le indicó deshacer.
Pregunta
¿Cómo puedo saber los dos administradores de transacciones para deshacer?
¿Puedo usar un solo administrador de transacciones cuando mis fuentes de datos no son compatibles con las transacciones XA?
Nota: La aplicación no requiere un administrador de transacciones en dataSourceA cuando se ejecuta en producción, ya que solo será de solo lectura. Este problema es solo para mis clases de exámenes.
Traté de factorizar un frijol auxiliar, pero esto no ayuda a la situación. En algún lugar bajo el capó DBUnit no se revertirá cuando haya múltiples transactionManagers. Voy a aceptar su respuesta para usar HSQL como el camino a seguir, sin embargo, en mi caso, sigo estancado porque utilizo Sybase para crear una tabla temporal en esta fuente de datos y la sintaxis no es compatible con HSQL. – Brad