项目中有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 class - &#39; org.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(&#34; tansactionManager2&#34;),事务管理器2的@transactional仅用于2个地方。我们能否为这些方法实施非AOP交易,以便没有太多变化?
答案 0 :(得分:0)
您可以使用限定符来指示要使用的事务管理器:
<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