当前位置:   article > 正文

springboot 分布式事务的解决方案(JTA+Atomic+多数据源)(^_^^_^)_springboot分布式事务

springboot分布式事务

首先,到底啥是分布式事务呢,比如我们在执行一个业务逻辑的时候有两步分别操作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相关依赖:

  1. <!--分布式事务-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-jta-atomikos</artifactId>
  5. </dependency>

点进去会发现里面整合好了:transactions-jms、transactions-jta、transactions-jdbc、javax.transaction-api 

二、把数据源的相关配置项单独提炼到一个application.yml中:

注意:

1.这回我们的spring.datasource.type 是com.alibaba.druid.pool.xa.DruidXADataSource;

2.spring.jta.transaction-manager-id的值在你的电脑中是唯一的,这个详细请阅读官方文档;

完整的yml文件如下:

  1. spring:
  2. datasource:
  3. type: com.alibaba.druid.pool.xa.DruidXADataSource
  4. druid:
  5. systemDB:
  6. name: systemDB
  7. url: jdbc:mysql://localhost:3306/springboot-mybatis?useUnicode=true&characterEncoding=utf-8
  8. username: root
  9. password: root
  10. # 下面为连接池的补充设置,应用到上面所有数据源中
  11. # 初始化大小,最小,最大
  12. initialSize: 5
  13. minIdle: 5
  14. maxActive: 20
  15. # 配置获取连接等待超时的时间
  16. maxWait: 60000
  17. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  18. timeBetweenEvictionRunsMillis: 60000
  19. # 配置一个连接在池中最小生存的时间,单位是毫秒
  20. minEvictableIdleTimeMillis: 30
  21. validationQuery: SELECT 1
  22. validationQueryTimeout: 10000
  23. testWhileIdle: true
  24. testOnBorrow: false
  25. testOnReturn: false
  26. # 打开PSCache,并且指定每个连接上PSCache的大小
  27. poolPreparedStatements: true
  28. maxPoolPreparedStatementPerConnectionSize: 20
  29. filters: stat,wall
  30. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  31. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  32. # 合并多个DruidDataSource的监控数据
  33. useGlobalDataSourceStat: true
  34. businessDB:
  35. name: businessDB
  36. url: jdbc:mysql://localhost:3306/springboot-mybatis2?useUnicode=true&characterEncoding=utf-8
  37. username: root
  38. password: root
  39. # 下面为连接池的补充设置,应用到上面所有数据源中
  40. # 初始化大小,最小,最大
  41. initialSize: 5
  42. minIdle: 5
  43. maxActive: 20
  44. # 配置获取连接等待超时的时间
  45. maxWait: 60000
  46. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  47. timeBetweenEvictionRunsMillis: 60000
  48. # 配置一个连接在池中最小生存的时间,单位是毫秒
  49. minEvictableIdleTimeMillis: 30
  50. validationQuery: SELECT 1
  51. validationQueryTimeout: 10000
  52. testWhileIdle: true
  53. testOnBorrow: false
  54. testOnReturn: false
  55. # 打开PSCache,并且指定每个连接上PSCache的大小
  56. poolPreparedStatements: true
  57. maxPoolPreparedStatementPerConnectionSize: 20
  58. filters: stat,wall
  59. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  60. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  61. # 合并多个DruidDataSource的监控数据
  62. useGlobalDataSourceStat: true
  63. #jta相关参数配置
  64. jta:
  65. log-dir: classpath:tx-logs
  66. transaction-manager-id: txManager

三、在DruidConfig.java中实现多个数据源的注册;分布式事务管理器的注册&

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号