jta:Java Transaction API,即是java中对事务处理的api
<https://www.baidu.com/s?wd=api&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao>
 即 api
<https://www.baidu.com/s?wd=api&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao>
即是接口的意思

atomikos:Atomikos TransactionsEssentials 是一个为Java平台提供增值服务的并且开源类事务管理器

1、pom依赖



2、application.properties---->注意前缀
# Mysql 1 mysql.datasource.test1.url =
jdbc:mysql://192.168.25.11:3306/18-08-12-manyDatasource1?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test1.username = root mysql.datasource.test1.password =
@sS19980713 mysql.datasource.test1.minPoolSize = 3
mysql.datasource.test1.maxPoolSize = 25 mysql.datasource.test1.maxLifetime =
20000 mysql.datasource.test1.borrowConnectionTimeout = 30
mysql.datasource.test1.loginTimeout = 30
mysql.datasource.test1.maintenanceInterval = 60
mysql.datasource.test1.maxIdleTime = 60 # Mysql 2 mysql.datasource.test2.url
=jdbc:mysql://192.168.25.11:3306/18-08-12-manyDatasource2?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test2.username =root mysql.datasource.test2.password
=@sS19980713 mysql.datasource.test2.minPoolSize = 3
mysql.datasource.test2.maxPoolSize = 25 mysql.datasource.test2.maxLifetime =
20000 mysql.datasource.test2.borrowConnectionTimeout = 30
mysql.datasource.test2.loginTimeout = 30
mysql.datasource.test2.maintenanceInterval = 60
mysql.datasource.test2.maxIdleTime = 60
3、书写读取配置类1和2
package czs.config; import
org.springframework.boot.context.properties.ConfigurationProperties; import
lombok.Data; @Data /** * 将application.properties配置文件中配置自动封装到实体类字段中 * @author
Administrator */ @ConfigurationProperties(prefix = "mysql.datasource.test1") //
注意这个前缀要和application.properties文件的前缀一样 public class DBConfig1 { private String
url; // 比如这个url在properties中是这样子的mysql.datasource.test1.username = root private
String username; private String password; private int minPoolSize; private int
maxPoolSize; private int maxLifetime; private int borrowConnectionTimeout;
private int loginTimeout; private int maintenanceInterval; private int
maxIdleTime; private String testQuery; } package czs.config; import
org.springframework.boot.context.properties.ConfigurationProperties; import
lombok.Data; @Data /** * 将application.properties配置文件中配置自动封装到实体类字段中 * @author
Administrator */ @ConfigurationProperties(prefix = "mysql.datasource.test2")//
注意这个前缀要和application.properties文件的前缀一样 public class DBConfig2 { private String
url; // 比如这个url在properties中是这样子的mysql.datasource.test1.username = root private
String username; private String password; private int minPoolSize; private int
maxPoolSize; private int maxLifetime; private int borrowConnectionTimeout;
private int loginTimeout; private int maintenanceInterval; private int
maxIdleTime; private String testQuery; }
4、开启扫描注册上面的两个配置文件类



5、两个数据源管理Bean
package czs.datasource; import java.sql.SQLException; import
javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean; import
org.mybatis.spring.SqlSessionTemplate; import
org.mybatis.spring.annotation.MapperScan; import
org.springframework.beans.factory.annotation.Qualifier; import
org.springframework.context.annotation.Bean; import
org.springframework.context.annotation.Configuration; import
com.atomikos.jdbc.AtomikosDataSourceBean; import
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource; import czs.config.DBConfig1;
@Configuration // basePackages 最好分开配置 如果放在同一个文件夹可能会报错 @MapperScan(basePackages
= "czs.mapper1", sqlSessionTemplateRef = "testSqlSessionTemplate") public class
MyBatisConfig1 { // 配置数据源 @Bean(name = "testDataSource") public DataSource
testDataSource(DBConfig1 testConfig) throws SQLException { MysqlXADataSource
mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(testConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(testConfig.getPassword());
mysqlXaDataSource.setUser(testConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true); // 将本地事务注册到创
Atomikos全局事务 AtomikosDataSourceBean xaDataSource = new
AtomikosDataSourceBean(); xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("testDataSource");
xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
xaDataSource.setTestQuery(testConfig.getTestQuery()); return xaDataSource; }
@Bean(name = "testSqlSessionFactory") public SqlSessionFactory
testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)
throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name =
"testSqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws
Exception { return new SqlSessionTemplate(sqlSessionFactory); } } package
czs.datasource; import java.sql.SQLException; import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory; import
org.mybatis.spring.SqlSessionFactoryBean; import
org.mybatis.spring.SqlSessionTemplate; import
org.mybatis.spring.annotation.MapperScan; import
org.springframework.beans.factory.annotation.Qualifier; import
org.springframework.context.annotation.Bean; import
org.springframework.context.annotation.Configuration; import
com.atomikos.jdbc.AtomikosDataSourceBean; import
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource; import czs.config.DBConfig2;
@Configuration @MapperScan(basePackages = "czs.mapper2", sqlSessionTemplateRef
= "test2SqlSessionTemplate") public class MyBatisConfig2 { // 配置数据源 @Bean(name
= "test2DataSource") public DataSource testDataSource(DBConfig2 testConfig)
throws SQLException { MysqlXADataSource mysqlXaDataSource = new
MysqlXADataSource(); mysqlXaDataSource.setUrl(testConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(testConfig.getPassword());
mysqlXaDataSource.setUser(testConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("test2DataSource");
xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
xaDataSource.setTestQuery(testConfig.getTestQuery()); return xaDataSource; }
@Bean(name = "test2SqlSessionFactory") public SqlSessionFactory
testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name =
"test2SqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
有两个不同的地方要注意

           1、@MapperScan(basePackages = "czs.mapper2", sqlSessionTemplateRef =
"test2SqlSessionTemplate")

                          basePackages扫描的mapper类包不要扫错了

           2、testDataSource()的参数为第三步的DBConfig1和DBConfig2

 

6、Service
package czs.mapper1; import
org.springframework.beans.factory.annotation.Autowired; import
org.springframework.stereotype.Service; import
org.springframework.transaction.annotation.Transactional; import
czs.mapper2.UserMapper2; /** * @author czs * @version 创建时间:2018年8月12日 下午7:28:07
*/ @Service public class ManyService1 { @Autowired private UserMapper1
userMapper1; @Autowired private UserMapper2 userMapper2; //
开启事务,由于使用jta+atomikos解决分布式事务,所以此处不必再指定事务 @Transactional public int
insert(String name, Integer age) { int insert = userMapper1.insert(name, age);
int i = 1 / age;// 赋值age为0故意引发事务 return insert; } //
开启事务,由于使用jta+atomikos解决分布式事务,所以此处不必再指定事务 @Transactional public int
insertDb1AndDb2(String name, Integer age) { int insert =
userMapper1.insert(name, age); int insert2 = userMapper2.insert(name, age); int
i = 1 / age;// 赋值age为0故意引发事务 return insert + insert2; } }
7、Controller
@RequestMapping(value = "insertDb1AndDb2") public int insertDb1AndDb2(String
name, Integer age) { return manyService1.insertDb1AndDb2(name, age); }
8、测试------------访问:http://localhost:8080/insertDb1AndDb2?name=2&age=0
<http://localhost:8080/insertDb1AndDb2?name=2&age=0>

9、查看数据库,如果没有一条数据插入,代表分布式事务管理成功。

 

 

 

 

 

 

 

 

 

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信