Java 多数据源时事务回滚问题

目录

问题描述

1、Atomikos事务管理器

2、MyBatis-Plus多数据源支持

dynamic-datasource

特性

约定

使用方法

mybatis-mate

特性

使用方法


问题描述


在多数据源的情况下,如果一个事务跨越多个数据源,当其中一个数据源的操作失败时,我们需要回滚所有已经执行的操作。然而,Java默认的事务管理机制只支持单个数据源的事务回滚,无法处理跨多个数据源的事务回滚。

1、Atomikos事务管理器

Atomikos是一个开源的事务管理器,它支持跨多个数据源的事务回滚。

下表展示了解决Java多数据源时事务回滚问题的步骤:


下面我们将逐步讲解每个步骤需要做的操作,并提供相应的代码和注释。

步骤1:配置Atomikos事务管理器
首先,我们需要在项目的依赖中添加Atomikos的相关依赖:

<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jta</artifactId>
    <version>4.0.6</version>
</dependency>
参考:https://blog.51cto.com/u_16213361/9268072

Spring Boot+Atomikos进行多数据源的分布式事务管理详解和实例-优快云博客

2、MyBatis-Plus多数据源支持

单一数据源已无法满足复杂业务需求,多数据源(动态数据源)应运而生。本文将介绍两种 MyBatis-Plus 的多数据源扩展插件:开源生态的 dynamic-datasource 和 企业级生态的 mybatis-mate

dynamic-datasource

dynamic-datasource 是一个开源的 Spring Boot 多数据源启动器,提供了丰富的功能,包括数据源分组、敏感信息加密、独立初始化表结构等。

特性

  • 数据源分组:适用于多种场景,如读写分离、一主多从等。
  • 敏感信息加密:使用 ENC() 加密数据库配置信息。
  • 独立初始化:支持每个数据库独立初始化表结构和数据库。
  • 自定义注解:支持自定义注解,需继承 DS
  • 简化集成:提供对 Druid、HikariCP 等连接池的快速集成。
  • 组件集成:支持 Mybatis-Plus、Quartz 等组件的集成方案。
  • 动态数据源:支持项目启动后动态增加或移除数据源。
  • 分布式事务:提供基于 Seata 的分布式事务方案。

约定

  • 本框架专注于数据源切换,不限制具体操作。
  • 配置文件中以下划线 _ 分割的数据源首部为组名。
  • 切换数据源可以是组名或具体数据源名。
  • 默认数据源名为 master,可通过 spring.datasource.dynamic.primary 修改。
  • 方法上的注解优先于类上的注解。

使用方法

1、引入依赖

  • SpringBoot2
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>${version}</version>
</dependency>
  • SpringBoot3
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
    <version>${version}</version>
</dependency>

2、配置数据源

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx)
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver

3、使用 @DS 切换数据源

@Service
@DS("slave")
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  @DS("slave_1")
  public List selectByCondition() {
    return jdbcTemplate.queryForList("select * from user where age >10");
  }
}

更多使用教程请参考Dynamic-Datasource 官网

mybatis-mate

mybatis-mate 是一个 MyBatis-Plus 的付费企业组件,内置很多好用的高级特性,其中包括多数据源扩展组件,提供了高效简单的多数据源支持。

特性

  • 注解 @Sharding:支持通过注解切换数据源。
  • 配置:支持灵活的数据源配置。
  • 动态加载卸载:支持动态加载和卸载数据源。
  • 多数据源事务:支持 JTA Atomikos 分布式事务。

使用方法

1、配置数据源

mybatis-mate:
  sharding:
    primary: mysql
    datasource:
      mysql:
        - key: node1
          ...
        - key: node2
          cluster: slave
          ...
      postgres:
        - key: node1
          ...

2、使用 @Sharding 切换数据源

@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {

    @Sharding("postgres")
    Long selectByUsername(String username);

}

3、切换指定数据库节点

// 切换到 mysql 从库 node2 节点
ShardingKey.change("mysqlnode2");

更多使用示例请参考

通过上述介绍,我们可以看到 dynamic-datasource 和 mybatis-mate 都提供了强大的多数据源支持,开发者可以根据项目需求选择合适的插件来实现数据源的灵活管理。

如果框架使用的mybits-plus建议采用2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

what_2018

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值