spring多数据源疑问

Kevin_Zhan 发布于 2017/03/08 17:04
阅读 137
收藏 2

如题,在spring多数据源里如果配置2个数据源进行update,则回滚后只会有一个能回滚,为什么2个都不能被回滚?原因是什么?是不是代理默认是第一个?

加载中
0
首席打酱油
首席打酱油

spring只支持一个事务管理器

Kit_lee
Kit_lee
回复 @Kevin_Zhan : 不,如果像你说的在同一个service里边对用两个dao(分别对应两个datasource)实现事务回滚的话。那就涉及分布式事务了,你可以看看www.atomikos.com和mysql的xa事务(当然我不确定你是用mysql)
Kevin_Zhan
Kevin_Zhan
回复 @Kit_lee : 之前测试过,在同一个Service下 通过不同的数据源进行update,只能有一个能回滚。好像要用到JTA
Kit_lee
Kit_lee
回复 @首席打酱油 : 多个事务管理器的配置见下面评论,但我不确定是否误解你的意思。首先多个事务配置对应多个数据源是可以的,但这是一对一的关系,事务管理器并不支持一对多。如果你说的只有一个transactionManager起作用是指一个事务管理器只对一个数据源起作用的话,你说的是对的,没错
首席打酱油
首席打酱油
回复 @Kit_lee : 你可以配置多个 但是没鸟用 只会有transactionManager起作用 工作中遇到过这种情况 一直没找到合适的解决方法 如有高招 请指教
Kit_lee
Kit_lee
transactionManager可以多个
0
_being
_being

能不能把你的配置贴一下看看,Spring可以配置多数据源

 

0
Kit_lee
Kit_lee

得看你的数据源和事务管理的配置,多个数据源对应多个事务管理器

0
Kit_lee
Kit_lee

@首席打酱油 

<context:component-scan base-package="me" />

<bean id="dataSource1"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@host2:1521:dbsid2" />
<property name="username" value="username2" />
<property name="password" value="password2" />
</bean>

<bean id="dataSource2"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@host3:1521:dbsid3" />
<property name="username" value="username3" />
<property name="password" value="password3" />
</bean>

<tx:annotation-driven/>

<bean id="txManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <qualifier value="txManager1"/>
<property name="dataSource" ref="dataSource1"/>
</bean>

<bean id="txManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <qualifier value="txManager2"/>
<property name="dataSource" ref="dataSource2"/>
</bean>

 

package me;

@Component
public class MyDAO {

    private DataSource dataSource;

    @Autowired
    @Qualifier("dataSource1")
    public void setDataSource1(DataSource ds) {
        template = new NamedParameterJdbcTemplate(ds);
    }

    @Autowired
    @Qualifier("dataSource2")
    public void setDataSource2(DataSource ds) {
        template = new NamedParameterJdbcTemplate(ds);
    }

    @Transactional("txManager1")    
    public String insertProcs() { }

    @Transactional("txManager2")    
    public String updateProcs() { }
}

 大概就是这样配置,希望对你有帮助

0
Kit_lee
Kit_lee

网上搜索了一下,spring原来是有个org.springframework.transaction.jta.JotmFactoryBean去支持分布式事务,但spring 2.5以后就没了,现在spring 3、4以及spring boot都是推荐集成第三方的分布式事务框架如 Atomikos 或 Bitronix,代码中使用的还是spring的事务管理器接口方法

返回顶部
顶部