【问题标题】:Spring Transaction Management using aspectj使用aspectj的Spring事务管理
【发布时间】:2016-02-18 09:11:15
【问题描述】:

一个项目中有 2 个配置文件。两者都使用 aspectj 对不同数据源进行事务管理,如下所示-

context1.xml

<!-- Creating TransactionManager Bean, since JDBC we are creating of type 
    DataSourceTransactionManager -->
<bean id="transactionManager1"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource1" />
</bean>

<!-- MySQL DB DataSource -->
<bean id="dataSource1"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/TestDB" />
    <property name="username" value="t" />
    <property name="password" value="t123" />
</bean>

上下文2。 xml

<!-- Creating TransactionManager Bean, since JDBC we are creating of type 
    DataSourceTransactionManager -->
<bean id="transactionManager2"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource2" />
</bean>

<!-- MySQL DB DataSource -->
<bean id="dataSource2"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/TestDB2" />
    <property name="username" value="t2" />
    <property name="password" value="t2123" />
</bean>

这会导致将抽象类的 transactionManager 属性 - 'org.springframework.transaction.interceptor.TransactionAspectSupport 设置为在服务器启动期间创建的最后一个注释事务方面 bean。

因此,如果最后实例化的 bean 属于 dataSource1,则在 dataSource1 上创建事务,否则为 dataSource2。 如何解决这个问题?

在事务管理的 DAO 类中使用事务如下-

@Transactional(propagation = Propagation.REQUIRED, rollbackFor =   customException.class)
@Override
public void addDoc(param doc) throws customException{

    addOrUpdate(testQuery, doc, "add new doc");
}

除了@transactional("tansactionManager2"),transactionManager2 的@transactional 仅在两个地方使用。我们可以为这些方法实现事务的非 AOP 实现,这样不会有太多的变化吗?

【问题讨论】:

    标签: java spring transactions aop aspectj


    【解决方案1】:

    您可以使用限定符来指示要使用的事务管理器:

     <tx:annotation-driven/>
        <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource1" />
        <qualifier value="transactionManager1"/>
    </bean>
    <bean id="transactionManager2"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource2" />
        <qualifier value="transactionManager2"/>
    </bean>
    

    并使用@Transactional("transactionManager1")@Transactional("transactionManager2") 注释您的服务方法。

    有关如何定义多个事务管理器的更多详细信息,请参阅Spring DOC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      相关资源
      最近更新 更多