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.

questionAnswers(3)

yourAnswerToTheQuestion