如何在 Spring Boot 中实现多数据源的事务管理?

news/2024/11/6 13:22:03 标签: spring boot, java, 数据库

在 Spring Boot 中实现多数据源的事务管理可以通过以下几种方式:

一、使用编程式事务管理

  1. 配置多个数据源

    • 如同前面提到的,在 application.properties 或 application.yml 文件中配置多个数据源的连接信息,并创建对应的数据源 bean。
  2. 手动开启和提交事务

    • 在需要使用多数据源事务的方法中,手动获取事务管理器并开启事务,执行数据库操作后提交事务。如果出现异常,则回滚事务。
     

    例如:

@Service
public class MultiDataSourceService {

    @Autowired
    private DataSourceOne dataSourceOne;

    @Autowired
    private DataSourceTwo dataSourceTwo;

    @Autowired
    private PlatformTransactionManager transactionManagerOne;

    @Autowired
    private PlatformTransactionManager transactionManagerTwo;

    public void multiDataSourceOperation() {
        TransactionStatus statusOne = transactionManagerOne.getTransaction(new DefaultTransactionDefinition());
        TransactionStatus statusTwo = transactionManagerTwo.getTransaction(new DefaultTransactionDefinition());

        try {
            // 对数据源一进行操作
            JdbcTemplate jdbcTemplateOne = new JdbcTemplate(dataSourceOne);
            jdbcTemplateOne.update("INSERT INTO table1...");

            // 对数据源二进行操作
            JdbcTemplate jdbcTemplateTwo = new JdbcTemplate(dataSourceTwo);
            jdbcTemplateTwo.update("INSERT INTO table2...");

            transactionManagerOne.commit(statusOne);
            transactionManagerTwo.commit(statusTwo);
        } catch (Exception e) {
            transactionManagerOne.rollback(statusOne);
            transactionManagerTwo.rollback(statusTwo);
            throw e;
        }
    }
}

二、使用声明式事务管理

  1. 配置事务管理器
    • 创建多个事务管理器 bean,分别对应不同的数据源。
@Configuration
public class TransactionConfig {

    @Bean(name = "transactionManagerOne")
    public PlatformTransactionManager transactionManagerOne(@Qualifier("dataSourceOne") DataSource dataSourceOne) {
        return new DataSourceTransactionManager(dataSourceOne);
    }

    @Bean(name = "transactionManagerTwo")
    public PlatformTransactionManager transactionManagerTwo(@Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
        return new DataSourceTransactionManager(dataSourceTwo);
    }
}

  1. 使用 @Transactional 注解
    • 在需要进行事务管理的方法上添加 @Transactional 注解,并指定事务管理器。
@Service
public class MultiDataSourceService {

    @Autowired
    private DataSourceOne dataSourceOne;

    @Autowired
    private DataSourceTwo dataSourceTwo;

    @Autowired
    @Qualifier("transactionManagerOne")
    private PlatformTransactionManager transactionManagerOne;

    @Autowired
    @Qualifier("transactionManagerTwo")
    private PlatformTransactionManager transactionManagerTwo;

    @Transactional("transactionManagerOne")
    public void operationOnDataSourceOne() {
        // 对数据源一进行操作
        JdbcTemplate jdbcTemplateOne = new JdbcTemplate(dataSourceOne);
        jdbcTemplateOne.update("INSERT INTO table1...");
    }

    @Transactional("transactionManagerTwo")
    public void operationOnDataSourceTwo() {
        // 对数据源二进行操作
        JdbcTemplate jdbcTemplateTwo = new JdbcTemplate(dataSourceTwo);
        jdbcTemplateTwo.update("INSERT INTO table2...");
    }
}

三、注意事项

  1. 异常处理:确保在事务方法中正确处理异常,以便事务能够正确回滚。
  2. 事务传播行为:根据实际需求设置 @Transactional 注解的事务传播行为,例如 REQUIREDREQUIRES_NEW 等。
  3. 数据源切换:在多数据源环境下,要注意在事务方法中正确切换数据源,以确保操作在正确的数据源上执行。

通过以上方法,你可以在 Spring Boot 中实现多数据源的事务管理,确保数据的一致性和完整性。


http://www.niftyadmin.cn/n/5740925.html

相关文章

使用Mybatis-plus出现数据库id很大或者为负数情况排查解决

背景介绍 在使用 MyBatis-Plus 框架时,主键生成是一个常见的需求。MyBatis-Plus 提供了多种主键生成策略,其中包括数据库自增、UUID 和雪花算法。雪花算法因其在高并发场景下的高效性和唯一性而被广泛采用。然而,有时候开发者会遇到使用雪花…

安利一款超6K+ star的可拖放响应式灵活的网格布局Gridstack.js

Gridstack.js是一个现代JavaScript(或Typescript)库,旨在帮助开发人员快速构建交互式和响应式的布局。以下是对Gridstack.js的详细介绍: 一、主要特点 灵活的网格布局:Gridstack.js允许开发者轻松地创建和管理网格布局…

【用Rust写CAD】第二章 第一节 Rust注释

文章目录 1、普通注释2、用于说明文档的注释 1、普通注释 Rust 中的注释方式与其它语言(C、C、Java)一样,支持两种注释方式: // 这是第一种注释方式/* 这是第二种注释方式 *//** 多行注释* 多行注释* 多行注释*/2、用于说明文档…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候,其实我们说的是两件东西: 一是小米模式的本质,即高效率的商业模式; 另一件是小米这家公司具象的商业模式,这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…

Nginx中的缓存与压缩配置

1. Nginx中的缓存介绍 由于 Nginx 是在网站的所有其他后台服务的最前线,它接收的请求和流量是后台服务的数倍甚至数十倍之多。因此,用好 Nginx 的缓存功能对于大型网站而言至关重要。Nginx 中的缓存功能优势如下: 提升所有客户端体验 有效降…

【Postman深入测试接口的详细指南】保姆级

Postman深入测试接口的详细操作步骤 一、创建测试集合二、使用环境变量三、编写请求四、编写测试脚本五、数据驱动测试六、模拟请求(Mocking)1. 创建Mock Server2. 定义响应3. 使用Mock Server进行请求 七、API监控1. 创建监控2. 运行监控 一、创建测试集…

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar ,这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar,这个不是完整的,它还…

如何产看SQL 查询的执行时间

要查看 SQL 查询的执行时间,尤其是毫秒级别,可以使用以下几种方法: 方法 1:使用 SET STATISTICS TIME 查看执行时间 SET STATISTICS TIME 会显示执行时间的详细信息,包括 CPU 时间和总耗时。启用后,SQL S…