1.SpringBoot整合事物管理

springboot默认集成事物,只主要在方法上加上@Transactional即可

启动类上的@EnableTransactionManagement注解可加可不加

@Transactional(value = "test1TransactionManager")

并指定其value值即可。同样的,value值与相应的事务管理方法名相匹配即可。value可以不指定

測試的時候遇到一個坑:mysql表类型是MyISAM无法实现事物回滚,需要改成InnoDB

mysql的表是有事务安全( 比如:InnoDB)和非事务安全(比如:ISAM、MyISAM)之分的

表类型是MyISAM,是非事务安全的,所以无法实现数据回滚。 
只要修改表的类型即可:alter table tablename type=InnoDb;

如果是用hibernate自动建表,而mysql数据库默认的建表类型不是InnoDb,需要修改配置文件:

2.SpringBoot分布式事物管理

使用springboot+jta+atomikos实现分布式事物管理

2.1 新增jta-atomikos依赖

   <!--使用springboot+jta+atomikos实现分布式事物管理--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId></dependency>

2.2 新增配置文件信息

# Mysql 1
mysql.datasource.test.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test.username = root
mysql.datasource.test.password = rootmysql.datasource.test.minPoolSize = 3
mysql.datasource.test.maxPoolSize = 25
mysql.datasource.test.maxLifetime = 20000
mysql.datasource.test.borrowConnectionTimeout = 30
mysql.datasource.test.loginTimeout = 30
mysql.datasource.test.maintenanceInterval = 60
mysql.datasource.test.maxIdleTime = 60
mysql.datasource.test.testQuery = select 1# Mysql 2
mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test2.username =root
mysql.datasource.test2.password =rootmysql.datasource.test2.minPoolSize = 3
mysql.datasource.test2.maxPoolSize = 25
mysql.datasource.test2.maxLifetime = 20000
mysql.datasource.test2.borrowConnectionTimeout = 30
mysql.datasource.test2.loginTimeout = 30
mysql.datasource.test2.maintenanceInterval = 60
mysql.datasource.test2.maxIdleTime = 60
mysql.datasource.test2.testQuery = select 1

2.3 读取配置文件信息

package com.ljl.spring.boot.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "mysql.datasource.test")
public class DBConfig1 {private String url;private String username;private String password;private int minPoolSize;private int maxPoolSize;private int maxLifetime;private int borrowConnectionTimeout;private int loginTimeout;private int maintenanceInterval;private int maxIdleTime;private String testQuery;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getMinPoolSize() {return minPoolSize;}public void setMinPoolSize(int minPoolSize) {this.minPoolSize = minPoolSize;}public int getMaxPoolSize() {return maxPoolSize;}public void setMaxPoolSize(int maxPoolSize) {this.maxPoolSize = maxPoolSize;}public int getMaxLifetime() {return maxLifetime;}public void setMaxLifetime(int maxLifetime) {this.maxLifetime = maxLifetime;}public int getBorrowConnectionTimeout() {return borrowConnectionTimeout;}public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {this.borrowConnectionTimeout = borrowConnectionTimeout;}public int getLoginTimeout() {return loginTimeout;}public void setLoginTimeout(int loginTimeout) {this.loginTimeout = loginTimeout;}public int getMaintenanceInterval() {return maintenanceInterval;}public void setMaintenanceInterval(int maintenanceInterval) {this.maintenanceInterval = maintenanceInterval;}public int getMaxIdleTime() {return maxIdleTime;}public void setMaxIdleTime(int maxIdleTime) {this.maxIdleTime = maxIdleTime;}public String getTestQuery() {return testQuery;}public void setTestQuery(String testQuery) {this.testQuery = testQuery;}}
package com.ljl.spring.boot.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "mysql.datasource.test2")
public class DBConfig2 {private String url;private String username;private String password;private int minPoolSize;private int maxPoolSize;private int maxLifetime;private int borrowConnectionTimeout;private int loginTimeout;private int maintenanceInterval;private int maxIdleTime;private String testQuery;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getMinPoolSize() {return minPoolSize;}public void setMinPoolSize(int minPoolSize) {this.minPoolSize = minPoolSize;}public int getMaxPoolSize() {return maxPoolSize;}public void setMaxPoolSize(int maxPoolSize) {this.maxPoolSize = maxPoolSize;}public int getMaxLifetime() {return maxLifetime;}public void setMaxLifetime(int maxLifetime) {this.maxLifetime = maxLifetime;}public int getBorrowConnectionTimeout() {return borrowConnectionTimeout;}public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {this.borrowConnectionTimeout = borrowConnectionTimeout;}public int getLoginTimeout() {return loginTimeout;}public void setLoginTimeout(int loginTimeout) {this.loginTimeout = loginTimeout;}public int getMaintenanceInterval() {return maintenanceInterval;}public void setMaintenanceInterval(int maintenanceInterval) {this.maintenanceInterval = maintenanceInterval;}public int getMaxIdleTime() {return maxIdleTime;}public void setMaxIdleTime(int maxIdleTime) {this.maxIdleTime = maxIdleTime;}public String getTestQuery() {return testQuery;}public void setTestQuery(String testQuery) {this.testQuery = testQuery;}}

2.4 创建多数据源

package com.ljl.spring.boot.DataSource;import java.sql.SQLException;import javax.sql.DataSource;import com.ljl.spring.boot.config.DBConfig1;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration
// basePackages 最好分开配置 如果放在同一个文件夹可能会报错
@MapperScan(basePackages = "com.ljl.spring.boot.test1", sqlSessionTemplateRef = "testSqlSessionTemplate")
public class TestMyBatisConfig1 {// 配置数据源@Primary@Bean(name = "testDataSource")public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("testDataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());return xaDataSource;}@Bean(name = "testSqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "testSqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}
package com.ljl.spring.boot.DataSource;import java.sql.SQLException;import javax.sql.DataSource;import com.ljl.spring.boot.config.DBConfig1;
import com.ljl.spring.boot.config.DBConfig2;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration
// basePackages 最好分开配置 如果放在同一个文件夹可能会报错
@MapperScan(basePackages = "com.ljl.spring.boot.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate")
public class TestMyBatisConfig2 {// 配置数据源@Bean(name = "test2DataSource")public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("test2DataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());return xaDataSource;}@Bean(name = "test2SqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "test2SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

2.5 启动加载配置

@EnableConfigurationProperties(value= { DBConfig1.class, DBConfig2.class })

SpringBoot(2.1.1)本地事物管理和分布式事物管理(五)相关推荐

  1. 使用LCN框架解决分布式事物

    使用LCN框架解决分布式事物 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战(干货) 构 ...

  2. Spring Boot 分布式事物管理

    Spring Boot 分布式事物管理 前言 事务是为了保证数据的一致性而产生的.那么分布式事务,顾名思义,就是我们要保证分布在不同数据库.不同服务器.不同应用之间的数据一致性. 在单体项目下数据是存 ...

  3. Spring-Boot + Atomikos 实现跨库的分布式事务管理

    一.何为事务 定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作成功,要么都不成功. 其必须遵循的四个原则(ACID): 原子性(Atomicity -- 美 [ˌætəˈ ...

  4. springboot+基于微信小程序的心理测评与活动管理的设计与实现 毕业设计-附源码191752

    小程序+spring boot心理测评与活动管理系统 摘  要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用 ...

  5. 怎么把项目推到gitlab上_将本地项目添加到 GitLab 上管理

    将本地项目添加到 GitLab 上管理 1, 先在 GitLab 上创建一个新的项目, 把开发人员加入项目 2, 在本地项目初始化 Git Git init 3, 从远程的 Git 仓库 pull 项 ...

  6. maven使用中央仓库没有的jar包001---Maven自定义上传第三方包到3rd party(第三方无依赖jar和本地扩展类加入maven统一管理)

    Maven自定义上传第三方包到3rd party(第三方无依赖jar和本地扩展类加入maven统一管理) 注:如果图片太小,则可以下载查看,CSDN,不提供点击放大! 1:用浏览器登陆nexus服务器 ...

  7. SpringBoot+Nacos+Seata实现Dubbo分布式事务管理

    SpringBoot+Nacos+Seata实现Dubbo分布式事务管理 https://www.shangmayuan.com/a/a3ba056126ba45db9b8dfd5b.html 源码下 ...

  8. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离

    在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理. ...

  9. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

最新文章

  1. php和nginx安装脚本,Nginx + PHP 配置和启动脚本
  2. 构建Hadoop伪分布式环境
  3. Java Ajax: DWR
  4. shell处理curl返回数据_shell神器curl用法笔记
  5. 4G DTU使用教程
  6. 热像仪 二次开发 c++_一种全新的红外热像仪——“可编程红外热像仪”
  7. java - 百钱百鸡小算法
  8. 用 Go 重构 C 语言系统,这个抗住春晚红包的百度转发引擎承接了万亿流量
  9. 【Fudan DISC】一种无监督下利用多模态文档结构信息帮助图片-句子匹配的采样方法...
  10. MongoDB 复制集(Replica Set) 配置(Windows 版)
  11. 黑白群晖 进阶篇 不得不注意的情况
  12. 网页端Excel开发与设计
  13. ps入门第8天_ps通道_颜色通道Alpha通道 案例:通道抠图
  14. 【苹果手机登录163邮箱】
  15. 根据ID3算法给出游玩的决策树的实战案例
  16. 熟练掌握python需要多久_全熟是什么意思
  17. 输入两个实数,用一个函数求出它们之和
  18. java+mysql基于SSM的班级管理系统#毕业设计
  19. 150 个 word 常用文书模板 推荐(附下载地址)
  20. 新手入门C语言常见的问题总结(一)

热门文章

  1. java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库
  2. 使用Freemark和aspose.word实现动态word转pdf
  3. Python:实现doomsday末日算法(附完整源码)
  4. Nginx的常用配置
  5. 微信小程序 云开发之数据库-查找记录
  6. pmw原理c语言,详细解析单片机 PMW 控制基本原理
  7. 别让抱怨毁了你的工作生活
  8. 对话苏宁张桂平 商协社团·万祥军:全国工商联谋民企凝聚力
  9. linux 访问windows本地项目异常如何解决,求助
  10. vue生成自定义样式二维码