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多数据源事务配置成功。