【发布时间】:2016-06-02 04:21:31
【问题描述】:
我有一个访问两个数据库的应用程序。显然,如果我需要跨越两个数据库的事务,我需要使用类似两阶段提交的东西。但我现在不需要这个保证之王,我不需要一切都是交易性的。事情可以独立崩溃或成功,应用程序可以处理它,而不是最终处于不一致的状态。
现在我有这样的设置(删除了接口、代码等,以使其尽可能简单地解释):
两个数据源:
<bean id="firstDS" class="org.springframework.jndi.JndiObjectFactoryBean">
<qualifier value="firstDS" />
<property name="jndiName" value="java:comp/env/jdbc/firstDS" />
</bean>
<bean id="secondDS" class="org.springframework.jndi.JndiObjectFactoryBean">
<qualifier value="secondDS" />
<property name="jndiName" value="java:comp/env/jdbc/secondDS" />
</bean>
仅一个数据源的一个事务管理器:
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="firstDS" />
</bean>
一项服务:
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class Service {
@Autowired
private FirstDao firstDao;
@Autowired
private SecondDao secondDao;
public void updateStuff() {
firstDao.updateStuff();
secondDao.updateStuff();
}
}
还有两个 DAO:
@Transactional(propagation = Propagation.MANDATORY)
public class FirstDao {
@Autowired
@Qualifier("firstDS")
private DataSource dataSource;
public void updateStuff() {
// updates stuff in the first database using dataSource
}
}
@Transactional(propagation = Propagation.MANDATORY)
public class SecondDao {
@Autowired
@Qualifier("secondDS")
private DataSource dataSource;
public void updateStuff() {
// updates stuff in the second database using dataSource
}
}
现在,这运行没有问题(或者至少没有我能观察到的问题),但我的问题是:
- 这是安全的还是有副作用?
- 第二个 DAO 的行为如何,因为它是事务性的,但事务是针对另一个数据库的?
- 我应该从第二个 DAO 中删除 @Transactional 注释吗?然后它的行为会像任何其他方法调用一样吗?
我已经阅读了参考资料和网上的各种帖子,但我仍然不确定这种行为。
【问题讨论】:
标签: java mysql spring transactions spring-transactions