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解决分布式事务问题相关推荐

  1. spring整合atomikos实现分布式事务的方法示例_分布式-分布式事务处理

    在之前的文章"如何合理的使用动态数据源"中,其实也提到了分布式事务相关的场景如:利用多数据源实现读写分离,但直接使用动态数据源频繁其实是很消耗资源的,而且就是当业务service一 ...

  2. spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  3. 分布式事务 - 如何解决分布式事务问题?

    分布式事物 - 如何解决分布式事务问题? 面试题 分布式事务了解吗?你们是如何解决分布式事务问题的? 面试官心理分析 只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑, ...

  4. spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...

    1.分布式事务模型 ACID 实现 1.1.X/Open XA 协议(XA) 最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Pro ...

  5. rabbitmq 查询版本_基于rabbitmq解决分布式事务

    分布式事务要解决的问题是保证二个数据库数据的一致性,本地事务ACID属于刚性事务,基于CAP理论,分布式事务的核心要点柔性事务,最终一致性. 基于rabbitmq解决分布式事务要点如下 生产者采用发送 ...

  6. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  7. RocketMQ如何解决分布式事务

    本文来说下RocketMQ如何解决分布式事务 文章目录 基本实现思路 RocketMQ的事务消息状态 代码实例 maven导入 yaml文件配置 核心代码 本文小结 基本实现思路 核心思想:事务消息总 ...

  8. 基于消息中间件解决分布式事务的开源框架Myth

    基于消息中间件的解决分布式事务框架:https://github.com/yu199195/myth 1.rpc框架支持 : dubbo,motan,springcloud. 2.消息中间件支持 : ...

  9. 解决分布式事务,Seata真香

    目录 背景介绍 什么是分布式事务 什么叫做逆向补偿呢 互联网最流行的分布式事务组件seata 总结 背景 大家好,今天给大家分享一个在 2022 年出去面试 Java 几乎必问的一个技术,那就是 se ...

最新文章

  1. 格式编号始终显示2个小数位
  2. Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)
  3. 201521123009《Java程序设计》第14周学习总结
  4. OSPF中DR和BDR作用简述
  5. seajs-require使用示例
  6. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
  7. python3 django连接mysql 数据库
  8. mobi格式电子书_进阶能力 | 了解常见的电子书格式
  9. jemter的竞品分析
  10. 兼任华为云总裁 余承东能否再续“终端辉煌”
  11. 解决 el-autocomplete 不显示及没数据时闪一下的问题
  12. surface 安卓双系统_一张图看懂微软Surface发布会:史上最大惊喜
  13. 如何在 Internet Explorer 中禁用和使用 ADODB.Stream 对象
  14. lsblk命令 – 查看系统的磁盘
  15. Excel潜能系列——Excel游戏 2048
  16. Python3 wxPython库
  17. 互动拍照 — 子弹时间
  18. put与mput_ftpput命令详解 ftp put命令使用哪个端口?
  19. lol服务器不稳定领皮肤,LOL免费领“源代码娜美”皮肤 官方致歉游戏卡顿问题...
  20. IQR(Inter-Quartile Range)

热门文章

  1. 重启服务后Redisson队列一直阻塞 不消费过期数据
  2. 根据当前时间 获取前一个月后一个月
  3. android 儿童 游戏,7-10岁儿童游戏大全
  4. 使用 Python (Pyxel)制作一个经典的 Lode Runner 游戏
  5. SSM Chapter 05 Spring 核心概念
  6. Datawhale pandas学习任务二:pandas基础
  7. 计算机图形学国际知名会议与期刊
  8. access的未来发展 ieee_IEEE Access 期刊怎么样,在国外认可度高吗?
  9. php使用echarts柱状图,php映射echarts柱状图
  10. 【项目原理】多点触摸屏驱动原理