Jak skonfigurować menedżery transakcji wielokrotnych za pomocą Spring + DBUnit + JUnit
W skrócie
Moja aplikacja Java z wiersza poleceń kopiuje dane z jednego źródła danych do innego bez użycia XA. Skonfigurowałem dwa oddzielne źródła danych i chciałbym wykonać test JUnit, który może wycofać dane z obu źródeł danych. Używam DBUnit do ładowania danych do „źródłowej” bazy danych, ale nie mogę tego przywrócić. Mogę przywrócić źródło danych „target”.
Mój kod
Biorąc pod uwagę tę konfigurację ...
<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>
i ten kod ...
@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();
}
}
Problem, jaki widzę, jest taki@TransactionConfiguration
określa tylko docelowe źródło danych, aby umożliwić wycofanie zmian. DBUnit przechodzidataSourceA
jawnie i wybiera domyślnego menedżera transakcji o nazwietransactionManager
(Nie jestem pewien, jak), który nie został poinformowany o wycofaniu.
Pytanie
Jak mogę powiedzieć obu menedżerom transakcji o wycofaniu?
Czy mogę używać pojedynczego menedżera transakcji, gdy moje źródła danych nie obsługują transakcji XA?
Uwaga: Aplikacja nie wymaga menedżera transakcji na dataSourceA, gdy jest uruchomiony w produkcji, ponieważ będzie tylko do odczytu. Ten problem dotyczy wyłącznie moich testów.