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多數據源事務配置成功。