JTA+Atomikos解决分布式事务问题
JTA分布式事务:Java Transaction API,允许应用程序执行分布式事务处理。
Atomikos:为java平台提供增值服务并且开源的事务管理器。
基于xa协议,xa协议是以两阶段提交协议为基础的。
这种处理方案一般是针对传统架构项目的分布式事务,不适合用在微服务架构中。
下面是springboot配置多个oracle数据源,重现分布式事务问题的例子
一、添加依赖
<dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.4</version></dependency><!-- 这里使用的是JPA包,也可使用JDBC包进行 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
由于maven仓库没有ojdbc6,需要自行下载安装
二、修改application.yml配置文件
spring:jpa:database: oracleshow-sql: truedatasource:master:jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:ORCLtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: oracle.jdbc.driver.OracleDriverusername: wxpassword: 123slave1:jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:ORCLtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: oracle.jdbc.driver.OracleDriverusername: wlpassword: 123456
三、创建数据源配置文件
@Configuration
public class DataSourceConfig {@Bean@Primary@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource dataSource1(){return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.slave1")public DataSource dataSource2(){return DataSourceBuilder.create().build();}
}
@Primary注释表示这个数据源是默认数据源,如果没有这个注释的话,开启事务的时候会报错
四、创建JdbcTemplate配置类
@Configuration
public class JdbcTemplateConfig {@Beanpublic JdbcTemplate template1(@Qualifier("dataSource1")DataSource dataSource1){return new JdbcTemplate(dataSource1);}@Beanpublic JdbcTemplate template2(@Qualifier("dataSource2")DataSource dataSource2){return new JdbcTemplate(dataSource2);}
}
五、使用测试类进行测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class JtaatomikosApplicationTests {@Autowiredprivate JdbcTemplate template1;@Autowiredprivate JdbcTemplate template2;@Test@Transactionalpublic void contextLoads() {String sql = "INSERT INTO \"test\" VALUES('asd','张三','24')";template1.update(sql);template2.update(sql);int i = 1/0;}}
test表只有三个字段:id,name,age
表里边数据都是空的。
执行测试方法contextLoads
控制台会抛异常
此时去数据库查看数据会发现
WL数据库插入数据成功了。
WX数据库插入数据失败了。
WX数据库是主数据源,说明主数据源事务回滚成功了,但是副数据源事务没有回滚,这就是分布式事务问题。
为了解决这个问题,我们引入atomikos解决
在原来的项目基础上,添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId></dependency>
修改数据源配置文件
@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource1(){Properties properties = new Properties();properties.setProperty("URL","jdbc:oracle:thin:@127.0.0.1:1521:ORCL");properties.setProperty("user","wx");properties.setProperty("password","123");AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();atomikosDataSourceBean.setXaProperties(properties);atomikosDataSourceBean.setUniqueResourceName("dataSource1");atomikosDataSourceBean.setXaDataSourceClassName("oracle.jdbc.xa.client.OracleXADataSource");return atomikosDataSourceBean;}@Beanpublic DataSource dataSource2(){Properties properties = new Properties();properties.setProperty("URL","jdbc:oracle:thin:@127.0.0.1:1521:ORCL");properties.setProperty("user","wl");properties.setProperty("password","123456");AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();atomikosDataSourceBean.setXaProperties(properties);atomikosDataSourceBean.setUniqueResourceName("dataSource2");atomikosDataSourceBean.setXaDataSourceClassName("oracle.jdbc.xa.client.OracleXADataSource");return atomikosDataSourceBean;}
}
可以发现,我们去掉了@Primary和@ConfigurationProperties注释,手动设置数据库参数,将数据源类型改成了AtomikoDataSourceBean类型,这个类型的数据源需要添加XADataSource类型的数据源参数,这里我们添加的是OracleXADataSource,这个类就是JTA类型的。
现在我们就已经把事务交给引入进来的全局事务协调了。
执行测试方法contextLoads
可以发现控制台同样抛出/ by zero异常,WX和WL数据库都没有插入数据,说明都进行事务回滚了。
JTA+Atomikos解决分布式事务问题相关推荐
- spring整合atomikos实现分布式事务的方法示例_分布式-分布式事务处理
在之前的文章"如何合理的使用动态数据源"中,其实也提到了分布式事务相关的场景如:利用多数据源实现读写分离,但直接使用动态数据源频繁其实是很消耗资源的,而且就是当业务service一 ...
- spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- 分布式事务 - 如何解决分布式事务问题?
分布式事物 - 如何解决分布式事务问题? 面试题 分布式事务了解吗?你们是如何解决分布式事务问题的? 面试官心理分析 只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑, ...
- spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...
1.分布式事务模型 ACID 实现 1.1.X/Open XA 协议(XA) 最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Pro ...
- rabbitmq 查询版本_基于rabbitmq解决分布式事务
分布式事务要解决的问题是保证二个数据库数据的一致性,本地事务ACID属于刚性事务,基于CAP理论,分布式事务的核心要点柔性事务,最终一致性. 基于rabbitmq解决分布式事务要点如下 生产者采用发送 ...
- 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...
- RocketMQ如何解决分布式事务
本文来说下RocketMQ如何解决分布式事务 文章目录 基本实现思路 RocketMQ的事务消息状态 代码实例 maven导入 yaml文件配置 核心代码 本文小结 基本实现思路 核心思想:事务消息总 ...
- 基于消息中间件解决分布式事务的开源框架Myth
基于消息中间件的解决分布式事务框架:https://github.com/yu199195/myth 1.rpc框架支持 : dubbo,motan,springcloud. 2.消息中间件支持 : ...
- 解决分布式事务,Seata真香
目录 背景介绍 什么是分布式事务 什么叫做逆向补偿呢 互联网最流行的分布式事务组件seata 总结 背景 大家好,今天给大家分享一个在 2022 年出去面试 Java 几乎必问的一个技术,那就是 se ...
最新文章
- 格式编号始终显示2个小数位
- Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)
- 201521123009《Java程序设计》第14周学习总结
- OSPF中DR和BDR作用简述
- seajs-require使用示例
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
- python3 django连接mysql 数据库
- mobi格式电子书_进阶能力 | 了解常见的电子书格式
- jemter的竞品分析
- 兼任华为云总裁 余承东能否再续“终端辉煌”
- 解决 el-autocomplete 不显示及没数据时闪一下的问题
- surface 安卓双系统_一张图看懂微软Surface发布会:史上最大惊喜
- 如何在 Internet Explorer 中禁用和使用 ADODB.Stream 对象
- lsblk命令 – 查看系统的磁盘
- Excel潜能系列——Excel游戏 2048
- Python3 wxPython库
- 互动拍照 — 子弹时间
- put与mput_ftpput命令详解 ftp put命令使用哪个端口?
- lol服务器不稳定领皮肤,LOL免费领“源代码娜美”皮肤 官方致歉游戏卡顿问题...
- IQR(Inter-Quartile Range)