gpt4 book ai didi

spring - 如何使用 Spring + DBUnit + JUnit 配置多个事务管理器

转载 作者:行者123 更新时间:2023-12-04 21:21:51 26 4
gpt4 key购买 nike

简而言之

我的命令行 Java 应用程序在不使用 XA 的情况下将数据从一个数据源复制到另一个数据源。我已经配置了两个单独的数据源,并且想要一个可以回滚两个数据源上的数据的 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 上的事务管理器,因为它只是只读的。此问题仅适用于我的测试类(class)。

最佳答案

使用 <qualifier>事务管理器定义中的元素。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceA" />
<qualifier value="transactionManager" />
</bean>

<bean id="transactionManagerTarget" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceB" />
<qualifier value="transactionManagerTarget" />
</bean>

然后你可以直接在 @Transactional中引用你想使用哪个注释,即
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:resources/spring-context.xml",
"classpath:resources/spring-db.xml"})
@Transactional("transactionManagerTarget")
@TransactionConfiguration(defaultRollback = true)
public class MyIntegrationTest {
...

关于spring - 如何使用 Spring + DBUnit + JUnit 配置多个事务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10651830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com