【发布时间】: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