2017-05-27 58 views
0

在我的项目中,我需要在一个事务中处理更多的数据库。交易注释或xml

1:使用注释,此报告错误 “重复标注”

public class TransactionalService { 

@Transactional("order") 
@Transactional("account") 
public void processTwoDatabases(String name) { ... } 

} 

XML段跟随

<bean id="transactionManager1" 
     class="org.springframework.jdbc.DataSourceTransactionManager"> 
     <qualifier value="order"/> 
</bean> 
<bean id="transactionManager2" 
     class="org.springframework.jdbc.DataSourceTransactionManager"> 
     <qualifier value="account"/> 
</bean> 

2:但是,使用XML,它工作正常:

<tx:advice id="txAdvice1" transaction-manager="transactionManager1"> 
    <!-- 定义方法的过滤规则 --> 
    <tx:attributes> 
     <tx:method name="process*" propagation="REQUIRED" read-only="false" 
        rollback-for="java.lang.Exception"/> 
    </tx:attributes> 
</tx:advice> 


<aop:config proxy-target-class="true"> 
    <aop:pointcut expression="execution (* com.service.impl.*.*(..))" id="services1"/> 
    <aop:advisor advice-ref="txAdvice1" pointcut-ref="services1"/> 
</aop:config> 


<tx:advice id="txAdvice2" transaction-manager="transactionManager2"> 
    <tx:attributes> 
     <tx:method name="process*" propagation="REQUIRED" read-only="false" 
        rollback-for="java.lang.Exception"/> 
    </tx:attributes> 
</tx:advice> 


<aop:config proxy-target-class="true"> 
    <aop:pointcut expression="execution (* com.service.impl.*.*(..))" id="services2"/> 
    <aop:advisor advice-ref="txAdvice2" pointcut-ref="services2"/> 
</aop:config> 

回答

0

Java不允许在同一元素上使用同一类型的多个注释,除非注释是(甲基)与@Repeatable -annotated:Multiple annotations of the same type on one element?

但是Transactional不是(甲基)与@Repeatable -annotated,因此仅的@Transactional一个实例是允许在一个类型或方法。

在这种情况下,您必须使用XML。

但请注意,您没有收到一笔交易。你实际上得到两个不同的交易,每个交易管理者一个。

此外,您没有在事务管理器定义中指定任何数据源,因此它们都使用相同的数据源(以及相同的数据库)。

要实际拥有一个事务,您可能需要XA事务支持。这里有一些链接:

  1. http://www.javaworld.com/article/2077714/java-web-development/xa-transactions-using-spring.html
  2. http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html
  3. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html
+0

我要回滚所有交易,如果这两个交易中的任何一个失败。在我的方式,两个transations如下:
'(1)为Transaction1开始' '(2)transaction2开始' '(3)我的业务逻辑代码' '(4)交易2端' '(5 )transaction1结束' 所以在1-4之间引发任何异常,两个事务将回滚。唯一的飞行是(4)和(5)之间抛出的异常,只有外部事务将回滚 ,但内部事务将提交.'@Roman Puchkovskiy' –

+0

请注意我关于XT Transaction的编辑 –