当前位置: 首页 > 面试题库 >

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

杜联
2023-03-14
问题内容

简而言之

我的命令行Java应用html" target="_blank">程序无需使用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上的事务管理器,因为它将是只读的。这个问题仅适用于我的测试班。


问题答案:

可能的解决方法是引入一个注释为的辅助bean,@Transactional("transactionManagerTarget")而将测试保留为@Transactional("transactionManager"),同时使用进行配置defaultRollback = true。然后,您的测试将不得不调用助手bean,而后者又将调用被测试的服务bean。这将导致服务周围的事务回滚,然后DBUnit周围的事务回滚。

不过,这有点混乱。

其他可能的方法:

  • 使用内存数据库(例如H2)而不是生产数据库-您可以将其配置为在需要时删除其所有数据。
  • 允许DBUnit提交,并在您的拆卸方法中进行补偿事务以清除数据。


 类似资料:
  • 问题内容: 我有2个数据库(MySql和HSQLDB)。我配置了2个数据源和2个EntityManagerFactory bean。我还可以配置2个对应的JpaTransactionManager bean。 但是我不知道如何指定应使用其中的哪一个来管理具体服务类的事务。我想为此使用注释,但实际上我只能指定txManagers之一: 这种情况下的出路是什么? 问题答案: JpaTransactio

  • 我正在使用带有spring jdbc事务支持的spring jdbc。 这是我的配置。 使用这个配置,事务对我来说不起作用。我不确定原因,但我能理解的是- 如您所见,jdbcTemplate()和txManager(),这两个方法都调用getDataSource()方法,该方法inturn创建JDBCDataSource。我认为在这两个方法中,我都创建了两个jdbc数据源,因此jdbcTempla

  • 我正在尝试使用beeline运行此命令。 错误:处理语句时出错:无法在运行时修改Hive.Support.Concurrency。它不在允许在运行时修改的参数列表中(状态=42000,代码=1) 谢谢你的帮助。

  • 我想要一些关于Spring Batch处理中数据流的信息,但在Internet上找不到我要找的东西(尽管本网站上有一些有用的问题)。 我正在努力建立在我们公司使用Spring Batch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,Spring Batch的行为如何。 这个问题侧重于分块过程,但可以随意提供有关其他模式的信息。 从我所看到的情况来看(如果我错了,请纠正我),当

  • 问题内容: 我正在使用Callable接口在serviceImpl中编写多线程程序。我正在使用spring事务管理器。在DB中执行更新操作时,它会成功执行。但是更新后的数据不会反映在DB中。但是,当我运行不带多线程的程序时,它将在DB中更新。 这是我的配置 我可以转向事务管理器的另一种方法。只是我想确认这种方法是否支持多线程。所以我的问题是 spring事务管理器是否支持多线程(我的意思是仅通过声

  • 本文向大家介绍Spring 使用注解方式进行事务管理配置方式,包括了Spring 使用注解方式进行事务管理配置方式的使用技巧和注意事项,需要的朋友参考一下 使用步骤: 步骤一、在spring配置文件中引入<tx:>命名空间 步骤二、具有@Transactional 注解的bean自动配置为声明式事务支持 步骤三、在接口或类的声明处 ,写一个@Transactional. 要是只在接口上写, 接口的