在同一个进程中支持多个Spring @Transactional回滚?

时间:2017-04-05 14:34:12

标签: spring integration-testing java-7 spring-transactions

有问题的项目使用Spring 4,Java 7,并坚持使用Oracle和PostgreSQL。

我正在为将数据保存到两个数据库的服务编写集成测试。对于集成测试,我希望两个事务都自动回滚。我知道如果不使用Java 8,我不能使用“重复”注释,因为我会收到编译错误。如果我在类级别放置一个注释,并且在方法级别放置另一个注释,我可以编译得很好。但是,似乎列出的较高注释不会回滚。为了澄清,如果我在类或方法级别声明@Transactional注释(Oracle或PostgreSQL)作为独立注释,那么一个回滚可以完美地工作。但是,如果我在类级别实现一个注释,并在方法级别实现另一个注释,则回滚仅适用于方法级别而不适用于类级别。

我怀疑多个@Transactional注释可以正常工作,只要该进程一次只尝试回滚一个。例如:一种方法使用Oracle Transaction,另一种方法使用PostgreSQL事务。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

好的,我想出了怎么做。有一个单独的SpringFramework项目" spring-data-commons"它有一个名为ChainedTransactionManager的类。我按如下方式连接了一个bean:

<bean id="chainedTransactionManager"
          class="org.springframework.data.transaction.ChainedTransactionManager">
        <constructor-arg>
            <list>
                <ref bean="postgresqlTransactionManager"/>
                <ref bean="oracleTransactionManager"/>
            </list>
        </constructor-arg>
    </bean>

然后我使用chainedTransactionManager作为我的注释

@Transactional(transactionManager = "chainedTransactionManager")

在进行此更改后,两个事务都按预期回滚。