赞
踩
首先,到底啥是分布式事务呢,比如我们在执行一个业务逻辑的时候有两步分别操作A数据源和B数据源,当我们在A数据源执行数据更改后,在B数据源执行时出现运行时异常,那么我们必须要让B数据源的操作回滚,并回滚对A数据源的操作;这种情况在支付业务时常常出现;比如买票业务在最后支付失败,那之前的操作必须全部回滚,如果之前的操作分布在多个数据源中,那么这就是典型的分布式事务回滚;
了解了什么是分布式事务,那分布式事务在java的解决方案就是JTA(即Java Transaction API);springboot官方提供了 Atomikos or Bitronix的解决思路;
其实,大多数情况下很多公司是使用消息队列的方式实现分布式事务。
本篇文章重点讲解springboot环境下,整合 Atomikos +mysql+mybatis+tomcat/jetty;
pom.xml中添加atomikos的springboot相关依赖:
- <!--分布式事务-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jta-atomikos</artifactId>
- </dependency>
点进去会发现里面整合好了:transactions-jms、transactions-jta、transactions-jdbc、javax.transaction-api
注意:
1.这回我们的spring.datasource.type 是com.alibaba.druid.pool.xa.DruidXADataSource;
2.spring.jta.transaction-manager-id的值在你的电脑中是唯一的,这个详细请阅读官方文档;
完整的yml文件如下:
- spring:
- datasource:
- type: com.alibaba.druid.pool.xa.DruidXADataSource
- druid:
-
- systemDB:
- name: systemDB
- url: jdbc:mysql://localhost:3306/springboot-mybatis?useUnicode=true&characterEncoding=utf-8
- username: root
- password: root
- # 下面为连接池的补充设置,应用到上面所有数据源中
- # 初始化大小,最小,最大
- initialSize: 5
- minIdle: 5
- maxActive: 20
- # 配置获取连接等待超时的时间
- maxWait: 60000
- # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- timeBetweenEvictionRunsMillis: 60000
- # 配置一个连接在池中最小生存的时间,单位是毫秒
- minEvictableIdleTimeMillis: 30
- validationQuery: SELECT 1
- validationQueryTimeout: 10000
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- # 打开PSCache,并且指定每个连接上PSCache的大小
- poolPreparedStatements: true
- maxPoolPreparedStatementPerConnectionSize: 20
- filters: stat,wall
- # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
- connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
- # 合并多个DruidDataSource的监控数据
- useGlobalDataSourceStat: true
-
- businessDB:
- name: businessDB
-
- url: jdbc:mysql://localhost:3306/springboot-mybatis2?useUnicode=true&characterEncoding=utf-8
- username: root
- password: root
- # 下面为连接池的补充设置,应用到上面所有数据源中
- # 初始化大小,最小,最大
- initialSize: 5
- minIdle: 5
- maxActive: 20
- # 配置获取连接等待超时的时间
- maxWait: 60000
- # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- timeBetweenEvictionRunsMillis: 60000
- # 配置一个连接在池中最小生存的时间,单位是毫秒
- minEvictableIdleTimeMillis: 30
- validationQuery: SELECT 1
- validationQueryTimeout: 10000
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- # 打开PSCache,并且指定每个连接上PSCache的大小
- poolPreparedStatements: true
- maxPoolPreparedStatementPerConnectionSize: 20
- filters: stat,wall
- # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
- connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
- # 合并多个DruidDataSource的监控数据
- useGlobalDataSourceStat: true
-
- #jta相关参数配置
- jta:
- log-dir: classpath:tx-logs
- transaction-manager-id: txManager
三、在DruidConfig.java中实现多个数据源的注册;分布式事务管理器的注册&
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。