SpringBoot2整合多数据源--基于分包结构(二)

SpringBoot-2.2.1.RELEASE版本-整合多数据源-基于分包结构

需求:多数据源配置环境下,如何进行事务管理 ?

根据SpringBoot2整合多数据源--基于分包结构(一),进行修改:

service:

修改成伪代码:

@Service
public class UserServiceTest {
    @Autowired
    private UserMapperTest userMapperTest;

    @Transactional(transactionManager = "TestTransactionManager")
    public String insertTest(String name, Integer age) {
        userMapperTest.insert(name, age);
        int i = 1 / 0;
        return "success";
    }
}
运行到int i = 1 / 0报错回滚,数据库没有添加数据。

@Transactional(transactionManager = "TestTransactionManager")指明使用哪个事务管理器。

需求:如果同时对两个数据库进行操作,怎样进行事务管理?

分别删除两个数据库连接配置类中该段代码:

修改两个数据库配置类,将其注册到全局事务管理器中,并注释掉本地事务管理器(否则会报错)。

@Bean(name = "TestDataSource")
public DataSource testDataSource(TestConfig 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;
}

修改application.yml:

spring:
  datasource:
    test:
     url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
     username: root
     password: 123456
     driver-class-name: com.mysql.jdbc.Driver
     minPoolSize: 3
     maxPoolSize: 25
     maxLifetime: 20000
     borrowConnectionTimeout: 30
     loginTimeout: 30
     maintenanceInterval: 60
     maxIdleTime: 60
     testQuery: select 1
    test1:
     url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
     username: root
     password: 123456
     driver-class-name: com.mysql.jdbc.Driver
     minPoolSize: 3
     maxPoolSize: 25
     maxLifetime: 20000
     borrowConnectionTimeout: 30
     loginTimeout: 30
     maintenanceInterval: 60
     maxIdleTime: 60
     testQuery: select 1

分别添加test、test1数据库的配置文件连接类: 

package com.ls.springboot.config.test;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "spring.datasource.test")
@Data
public class TestConfig {
   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;
}

启动类加载读取数据库连接配置类:

@EnableConfigurationProperties({TestConfig.class, Test1Config.class})

修改UserServiceTest:

@Service
public class UserServiceTest {
    @Autowired
    private UserMapperTest userMapperTest;
    @Autowired
    private UserMapperTest1 userMapperTest1;

    @Transactional()
    public String insertTest(String name, Integer age) {
        userMapperTest.insert(name, age);
        int i = 1 / 0;
        userMapperTest1.insert(name, age);
        return "success";
    }
}

此时运行到int i = 1 / 0报错,回滚,数据库未添加成功。至此,jta+atomic多数据源事务配置成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值