springboot事务回滚报错No qualifying bean of type ‘org.springframework.transaction.TransactionManager‘ avai

当项目配置了多个数据源后,@Transactional注解默认无法确定使用哪个事务管理器。解决方法是在配置文件中为每个数据源创建事务管理器,并在使用@Transactional时指定transactionManager属性。例如,在配置类中创建名为'transactionManager'的事务管理器,并在需要事务的方法上添加@Transactional(transactionManager=transactionManager)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错信息如下:No qualifying bean of type 'org.springframework.transaction.TransactionManager' available

        经调查发现是项目配置多数据源导致的。
        项目中配置多个数据源后,在使用@Transactional()注解时如果不直接指定使用的数据源,Spring就不知道具体使用哪一个事务管理器来进行事务管理了,因此需要通过某种方式来具体指定一下。可以通过使用 @Transactional(transactionManager = “xxTransactionManager”) 来进行指定。

解决办法:

1.在配置数据源的配置中,创建事务管理器。

package com.xxxx.xxxxx.core.config;

import com.ibeetl.starter.BeetlTemplateCustomize;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class BeetlFrameworkConfig {

    @Bean(name = "dataSource")
    public DataSource datasource(Environment env) {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(env.getProperty("spring.datasource.first.url"));
        ds.setUsername(env.getProperty("spring.datasource.first.username"));
        ds.setPassword(env.getProperty("spring.datasource.first.password"));
        ds.setDriverClassName(env.getProperty("spring.datasource.first.driver-class-name"));
        ds.setMaximumPoolSize(50); // 连接池大小,默认10
        ds.setConnectionTimeout(60000); // 等待来自池的连接的最大毫秒数,默认30秒
        return ds;
    }
    @Bean(name = "whmDataSource")
    public DataSource whmDataSource(Environment env) {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(env.getProperty("spring.whmDataSource.second.url"));
        ds.setUsername(env.getProperty("spring.whmDataSource.second.username"));
        ds.setPassword(env.getProperty("spring.whmDataSource.second.password"));
        ds.setDriverClassName(env.getProperty("spring.whmDataSource.second.driver-class-name"));
        ds.setMaximumPoolSize(50); // 连接池大小,默认10
        ds.setConnectionTimeout(60000); // 等待来自池的连接的最大毫秒数,默认30秒
        return ds;
    }

    // 创建事务管理器
    @Bean(name = "transactionManager")
    public PlatformTransactionManager txManager(@Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

2.在原添加事务(@Transactional)处指定事务管理器

@Transactional(transactionManager = "transactionManager")

 以上两步,解决了我的问题,在此记录一下,大家可以适当参考。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值