簡體   English   中英

使用aspectj進行Spring事務管理

[英]Spring Transaction Management using 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類的'transorg.springframework.transaction.interceptor.TransactionAspectSupport的transactionManager屬性設置為服務器啟動期間創建的最后一個注釋事務方面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代替@transactional(“ tansactionManager2”),僅在2個地方使用@transactional。 我們可以為這些方法實現非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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM