手短に
私のコマンド ライン Java アプリケーションは、XA を使用せずに、あるデータ ソースから別のデータ ソースにデータをコピーします。2 つの別個のデータソースを構成しており、両方のデータソースのデータをロールバックできる JUnit テストが必要です。DBUnit を使用して「ソース」データベースにデータをロードしましたが、これをロールバックできません。「ターゲット」データソースをロールバックすることができます。
マイコード
この構成を考えると...
<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>
そしてこのコード...
@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();
}
}
私が見ている問題は@TransactionConfiguration
、ロールバックを有効にするためのターゲットデータソースのみを示していることです。DBUnit はdataSourceA
明示的に渡さtransactionManager
れており、ロールバックするように指示されていない (方法はわかりません) という名前のデフォルトのトランザクション マネージャーを取得しています。
質問
両方のトランザクション マネージャーにロールバックするように指示するにはどうすればよいですか?
データソースが XA トランザクションをサポートしていない場合、単一のトランザクション マネージャーを使用できますか?
注: アプリケーションは、読み取り専用であるため、本番環境で実行する場合、dataSourceA にトランザクション マネージャーを必要としません。この問題は、私のテスト クラスのみに適用されます。