Como configurar gerenciadores de transações múltiplas com Spring + DBUnit + JUnit
Em poucas palavras
Meu aplicativo Java de linha de comando copia dados de uma fonte de dados para outra sem usar o XA. Configurei duas origens de dados separadas e gostaria de um teste JUnit que possa reverter dados em ambas as origens de dados. Eu uso o DBUnit para carregar dados no banco de dados "fonte", mas não consigo fazer isso para reversão. Eu posso obter a fonte de dados "destino" para reverter.
Meu código
Dada esta configuração ...
<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>
e esse 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();
}
}
O problema, como eu vejo, é que@TransactionConfiguration
apenas informa a origem de dados de destino para ativar uma reversão. DBUnit está sendo passadodataSourceA
explicitamente e está pegando o gerenciador de transações padrão chamadotransactionManager
(Eu não sei como) que não foi dito para reverter.
Questão
Como posso dizer a ambos os gerentes de transação a reversão?
Posso usar um único gerenciador de transações quando minhas origens de dados não suportam transações XA?
Nota: O aplicativo não requer um gerenciador de transações no dataSourceA ao executar em produção, pois ele será somente de leitura. Esse problema é apenas para minhas classes de testes.