SpringBoot使用多数据源时怎么解决事务不生效问题

在使用多数据源时,如果不进行特殊处理,可能会出现事务不生效的问题。这是因为 Spring Boot 默认只会为一个数据源创建一个事务管理器,如果要使用多个数据源,就需要为每个数据源创建一个事务管理器,并在需要使用事务的方法或类上指定使用哪个事务管理器。

 以下是解决事务不生效问题的具体步骤:

1. 在配置文件中配置多个数据源和相应的事务管理器,例如:

spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/db1
      username: root
      password: root
    secondary:
      url: jdbc:mysql://localhost:3306/db2
      username: root
      password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

# 配置事务管理器
spring.datasource.primary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.filters=stat,wall,log4j
spring.datasource.primary.maxActive=20
spring.datasource.primary.initialSize=1
spring.datasource.primary.maxWait=60000
spring.datasource.primary.minIdle=1
spring.datasource.primary.timeBetweenEvictionRunsMillis=60000
spring.datasource.primary.minEvictableIdleTimeMillis=300000
spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
spring.datasource.primary.testWhileIdle=true
spring.datasource.primary.testOnBorrow=false
spring.datasource.primary.testOnReturn=false
spring.datasource.primary.poolPreparedStatements=true
spring.datasource.primary.maxOpenPreparedStatements=20
spring.datasource.primary.filters=stat,wall,log4j
spring.datasource.primary.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

spring.datasource.secondary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.filters=stat,wall,log4j
spring.datasource.secondary.maxActive=20
spring.datasource.secondary.initialSize=1
spring.datasource.secondary.maxWait=60000
spring.datasource.secondary.minIdle=1
spring.datasource.secondary.timeBetweenEvictionRunsMillis=60000
spring.datasource.secondary.minEvictableIdleTimeMillis=300000
spring.datasource.secondary.validationQuery=SELECT 1 FROM DUAL
spring.datasource.secondary.testWhileIdle=true
spring.datasource.secondary.testOnBorrow=false
spring.datasource.secondary.testOnReturn=false
spring.datasource.secondary.poolPreparedStatements=true
spring.datasource.secondary.maxOpenPreparedStatements=20
spring.datasource.secondary.filters=stat,wall,log4j
spring.datasource.secondary.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

# 配置事务管理器
spring.datasource.primary.transaction-manager-name=primaryTransactionManager
spring.datasource.secondary.transaction-manager-name=secondaryTransactionManager

2. 创建多个事务管理器的 Bean,例如

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
    @Bean(name = "primaryTransactionManager")
    public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return new DataSourceTransactionManager(primaryDataSource);
    }

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

3. 在需要使用事务的方法或类上使用 @Transactional 注解,并指定使用哪个事务管理器,例如:

@Service
public class UserServiceImpl implements UserService {

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

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

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;

    @Override
    @Transactional(transactionManager = "primaryTransactionManager")
    public void addUserToPrimary(User user) {
        // 使用 primaryDataSource 数据源进行操作
    }

    @Override
    @Transactional(transactionManager = "secondaryTransactionManager")
    public void addUserToSecondary(User user) {
        // 使用 secondaryDataSource 数据源进行操作
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
您好!对于多数据源配置中驼峰映射不生效问题,可能有以下几个原因和解决方案: 1. MyBatis 配置文件设置问题:请确保每个数据源的 MyBatis 配置文件中,已经正确开启了驼峰命名规则的映射。在配置文件的 `<settings>` 标签中添加如下设置即可: ```xml <setting name="mapUnderscoreToCamelCase" value="true" /> ``` 这样就可以将数据库的下划线命名转换为驼峰命名。 2. 实体类字段和数据库字段不匹配:请检查实体类中的属性名和数据库表的字段名是否一致,包括大小写。如果不一致,可以使用 `@Column` 注解或者在配置文件中进行手动映射,确保二者对应。 3. MyBatis 的 resultMap 配置问题:如果使用 resultMap 进行字段映射,需要确保 resultMap 中的字段名与数据库表中的字段名一致。可以使用 `<resultMap>` 标签进行配置,并在 `<result>` 标签中使用 column 属性指定数据库字段名。 4. 数据库连接驱动问题:有些数据库连接驱动默认是不支持驼峰命名转换的,您可以尝试更换合适的数据库连接驱动,例如使用 druid 连接池等。 5. 缓存问题:如果您启用了缓存机制,可能会导致数据不及更新。可以尝试关闭缓存,或者在更新操作后手动清除缓存。 请根据具体情况逐一排查上述原因,并进行相应的解决方案尝试,希望能帮到您!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值