网站首页 > 技术文章 正文
在《Spring Boot JDBC多数据源》中,我们已经可以使用多个数据源为服务提供持久化能力。在单个数据源的时候,我们可以借助数据库本身的事务机制,保持数据的一致性,那么,在多个数据源的情况下,我们如何保证数据的一致性呢?这一章节我们来了解一下。
什么是分布式事务
要了解多个数据源如何保持数据一致性时,我们先来看一个概念:分布式事务。究竟什么是分布式事务呢?
简单来说,一个事务包含多个操作,多个操作操作了多个数据源,这样的事务称为分布式事务。
什么是JTA
说起JTA,我们就需要说一下XA协议了。
- XA协议:XA是X/Open DTP组织(X/Open DTP group)定义的包含:两阶段提交协议,三阶段提交协议,XA被许多数据库(如Oracle、DB2、SQL Server、MySQL)和中间件等工具(如CICS 和 Tuxedo)支持 。
- JTA:JTA(Java Transaction API),是J2EE的编程接口规范,它是XA协议的JAVA实现。某种程度上,可以认为JTA规范是XA规范的Java版。
- Atomikos:Atomikos是一个分布式事务管理器,是JTA / XA的具体实现,提供的功能比JTA / XA所要求的更多
JTA示意图:
Spring Boot JTA实例
引入pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
配置文件
spring:
datasource:
primary:
uniqueResourceName: primary
xaDataSourceClassName: com.mysql.cj.jdbc.MysqlXADataSource
xaProperties:
url: jdbc:mysql://ip:port/springboot_demo?characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true
user: root
password: xxxxxxx
exclusiveConnectionMode: true
minPoolSize: 3
maxPoolSize: 10
second:
uniqueResourceName: second
xaDataSourceClassName: com.mysql.cj.jdbc.MysqlXADataSource
xaProperties:
url: jdbc:mysql://ip:port/springboot_demo_2?characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true
user: root
password: xxxxxxx
exclusiveConnectionMode: true
minPoolSize: 3
maxPoolSize: 10
数据源配置
@Configuration
public class DataSourceConfig {
@Bean(initMethod = "init", destroyMethod = "close", name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary
public DataSource primaryDataSource() {
return new AtomikosDataSourceBean();
}
@Bean(initMethod = "init", destroyMethod = "close", name = "secondDataSource")
@Qualifier("secondDataSource")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource secondDataSource() {
return new AtomikosDataSourceBean();
}
}
JdbcTemplate配置
@Configuration
public class JdbcTemplateConfig {
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
统一事务配置
@Configuration
public class TransacationManagerConfig {
@Bean
public UserTransaction userTransaction() throws SystemException {
UserTransaction userTransaction = new UserTransactionImp();
userTransaction.setTransactionTimeout(10000);
return userTransaction;
}
@Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")
public TransactionManager atomikosTransacationManager() throws Throwable{
UserTransactionManager userTransactionManager = new UserTransactionManager();
userTransactionManager.setForceShutdown(false);
return userTransactionManager;
}
@Bean(name = "transacationManager")
public PlatformTransactionManager transactionManager() throws Throwable {
UserTransaction userTransaction = new UserTransactionImp();
JtaTransactionManager manager = new JtaTransactionManager(userTransaction, atomikosTransacationManager());
return manager;
}
}
测试
由于是在上个工程
《JDBC读数据源》
https://gitee.com/pftian/spring-boot-learning/tree/master/spring-boot-jdbc-multiple-datasource
的基础上做的改造,我们直接编写测试用例。
@SpringBootTest(classes = JDBCApplication.class)
public class JTATest {
@Autowired
UserService userService;
@Autowired
LogService logService;
@Test
@Transactional
public void testJTATransaction() {
User user = new User();
Log log = new Log();
user.setBorthday(new Date());
user.setName("jta");
log.setLogTime(new Date());
log.setIp("22222");
log.setMethod("xxxxx");
userService.save(user);
logService.save(log);
// 手动制造异常
int a = 100/0;
}
}
伙伴们,行动起来,加油!!!
源码地址:Spring Boot Learning: 学习springboot中的各个组件,编写示例工程 运行spring-boot-jdbc-jta工程。
猜你喜欢
- 2025-07-28 Datapump数据迁移前的准备工作(数据迁移流程图)
- 2025-07-28 Spring Boot 分布式事务实现简单得超乎想象
- 2024-10-29 【服务器数据恢复】服务器硬盘坏道掉线怎么恢复数据?
- 2024-10-29 ORACLE常见问题-100问(系列二) oracle常见错误
- 2024-10-29 Linux面试题Oracle oracle面试题及答案
- 2024-10-29 oracle静默安装的详解 oracle19c静默安装实例
- 2024-10-29 Oracle 不是有效的导出文件,标头验证失败 解决方法
- 2024-10-29 生产环境中imp导入强制中断问题解决
- 2024-10-29 数据库笔试面试149——imp工具的ignore参数有什么作用?
- 2024-10-29 当生产环境imp导入数据时不小心中断了怎么办?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)