Spring使用aspectj进行事务管理

在一个项目中有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>

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

因此,如果实例化的最后一个bean是dataSource1的,则事务在dataSource1上创建,否则在dataSource2上创建。 这个问题怎么解决?

在TransactionManagement的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仅在2个地方使用。 我们能否为这些方法实现非AOP的事务实现,以便没有太多变化?


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

 <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

链接地址: http://www.djcxy.com/p/60297.html

上一篇: Spring Transaction Management using aspectj

下一篇: detachCopy is working on JDO with ObjectDB?