7-springboot-多数据源事务管理-jta+atomikos的分布式事务

发布时间 2023-03-22 21:16:26作者: companion

jta+atomikos的分布式事务

<!--jta+atomikos分布式事务-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

在上一篇文章的基础上删除RefundDBDataSource

 

 

 新增加数据源的配置

@Configuration //== xml文件的作用
@MapperScan(basePackages = "com.example.springboot.dao.refund",sqlSessionFactoryRef = "refunddbSqlSessionFactory")
public class RefundDB4jtaDataSource {
@Value("${spring.datasource.refunddb.jdbc-url}")
private String url;
@Value("${spring.datasource.refunddb.username}")
private String user;
@Value("${spring.datasource.refunddb.password}")
private String password;
//1.datasource
@Bean(name = "refunddbDataSource")
// @ConfigurationProperties(prefix = "spring.datasource.refunddb")//application.properties文件中的配置前缀
public DataSource refunddbDataSource(){
//创建一个数据源-MYSQL驱动实现
MysqlXADataSource datasource = new MysqlXADataSource();
datasource.setURL(url);
datasource.setUser(user);
datasource.setPassword(password);
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setXaDataSource(datasource);
atomikosDataSourceBean.setUniqueResourceName("refunddbDataSource");
atomikosDataSourceBean.setMaxPoolSize(30);
atomikosDataSourceBean.setMinPoolSize(5);
return atomikosDataSourceBean;
}
//2.sqlSessionFactory
@Bean(name = "refunddbSqlSessionFactory")
public SqlSessionFactory refunddbSqlSessionFactory(@Qualifier("refunddbDataSource") DataSource refunddbDataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(refunddbDataSource);
return sqlSessionFactoryBean.getObject();
}
//3.sqlSessionTemplate
@Bean(name = "refunddbSqlSessionTemplate")
public SqlSessionTemplate refunddbSqlSessionTemplate(@Qualifier("refunddbSqlSessionFactory")SqlSessionFactory refunddbSqlSessionFactory){
return new SqlSessionTemplate(refunddbSqlSessionFactory);
}
//事务的处理
@Bean
public DataSourceTransactionManager refunddbDataSourceTransactionManager(@Qualifier("refunddbDataSource") DataSource refunddbDataSource){
return new DataSourceTransactionManager(refunddbDataSource);
}
}
----------------------------------------------------UserDB4jtaDataSource------------------------------------------------
@Configuration //== xml文件的作用
@MapperScan(basePackages = "com.example.springboot.dao.user",sqlSessionFactoryRef = "userdbSqlSessionFactory")
public class UserDB4jtaDataSource {
@Value("${spring.datasource.userdb.jdbc-url}")
private String url;
@Value("${spring.datasource.userdb.username}")
private String user;
@Value("${spring.datasource.userdb.password}")
private String password;
//1.datasource
@Bean(name = "userdbDataSource")
// @ConfigurationProperties(prefix = "spring.datasource.userdb")//application.properties文件中的配置前缀
public DataSource userdbDataSource(){
//创建一个数据源-MYSQL驱动实现
MysqlXADataSource datasource = new MysqlXADataSource();
datasource.setURL(url);
datasource.setUser(user);
datasource.setPassword(password);
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setXaDataSource(datasource);
atomikosDataSourceBean.setUniqueResourceName("userdbDataSource");
atomikosDataSourceBean.setMaxPoolSize(30);
atomikosDataSourceBean.setMinPoolSize(5);
return atomikosDataSourceBean;
}
//2.sqlSessionFactory
@Bean(name = "userdbSqlSessionFactory")
public SqlSessionFactory userdbSqlSessionFactory(@Qualifier("userdbDataSource") DataSource userdbDataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(userdbDataSource);
return sqlSessionFactoryBean.getObject();
}
//3.sqlSessionTemplate
@Bean(name = "userdbSqlSessionTemplate")
public SqlSessionTemplate userdbSqlSessionTemplate(@Qualifier("userdbSqlSessionFactory")SqlSessionFactory userdbSqlSessionFactory){
return new SqlSessionTemplate(userdbSqlSessionFactory);
}
//事务的处理
@Bean
public DataSourceTransactionManager userdbDataSourceTransactionManager(@Qualifier("userdbDataSource") DataSource userdbDataSource){
return new DataSourceTransactionManager(userdbDataSource);
}
}

分布式事务处理

@Autowired
TblSysuserInfoMapper tblSysuserInfoMapper;
@Override
@Transactional//事务需要使用分布式事务-此时使用的就生效的事务
public String getUserNo() {
/*int i = 1/0;
return tblSysuserInfoMapper.selectByPrimaryKey("100000").getUserNo();*/
//商品库减去
//订单库增加
//以上对应两个库,
return "";
}