【问题标题】:Multiple Spring @Transactional rollbacks supported in same process?在同一进程中支持多个 Spring @Transactional 回滚?
【发布时间】:2017-04-05 14:34:12
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    好的,我想出了怎么做。有一个单独的 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")
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 2018-09-27
      • 2020-06-12
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2016-12-11
      相关资源
      最近更新 更多