database-all icon indicating copy to clipboard operation
database-all copied to clipboard

Springboot TransactionManager 报错

Open hawind opened this issue 3 years ago • 5 comments

感觉是事物管理出问题了,我这边因为还使用了hibernate,会导致下面的配置报错。

@Bean
@ConditionalOnMissingBean
public GaarasonTransactionManager gaarasonTransactionManager() {
    logger.info("-------------------- gaarasonTransactionManager init ------------------");
    return new GaarasonTransactionManager(gaarasonDataSource());
}

报错截图 image

GaarasonDatabaseConfiguration自定义的代码,因为database-spring-boot-starter里没有配置@Primary优先级,也会导致出问题

@Slf4j
@Configuration
@AutoConfigureBefore(DruidDataSourceAutoConfigure.class)
@EnableConfigurationProperties({GaarasonDatabaseProperties.class})
@Import({GeneralModel.class})
public class GaarasonDatabaseConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(GaarasonDatabaseConfiguration.class);

    /**
     * 指定 model 扫描范围
     */
    GaarasonDatabaseConfiguration(ApplicationContext applicationContext, GaarasonDatabaseProperties gaarasonDatabaseProperties) {
        // 注册 model实例获取方式
        ModelInstanceProvider.register(modelClass -> {
            try {
                return ObjectUtils.typeCast(applicationContext.getBean(modelClass));
            } catch (BeansException e) {
                return ObjectUtils.typeCast(applicationContext.getBean(StringUtils.lowerFirstChar(modelClass.getSimpleName())));
            }
        });
        logger.info("Model instance provider has been registered success.");

        // 注册 雪花id实现
        final int workerId = gaarasonDatabaseProperties.getSnowFlake().getWorkerId();
        final int dataId = gaarasonDatabaseProperties.getSnowFlake().getDataId();
        ContainerProvider.register(IdGenerator.SnowFlakesID.class, clazz -> new SnowFlakeIdGenerator(workerId, dataId));

        logger.info("SnowFlakesID[ workId: {}, dataId: {}] instance has been registered success.", workerId, dataId);
    }

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource2")
    @ConditionalOnMissingBean
    public DataSource dataSourceDruidConfig() {
        logger.info("-------------------- dataSource druid config init ---------------------");
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConditionalOnMissingBean
    public GaarasonDataSource gaarasonDataSource() {
        logger.info("-------------------- gaarasonDataSource init --------------------------");
        return ContainerProvider.getBean(GaarasonDataSourceConfig.class).build(Collections.singletonList(dataSourceDruidConfig()));
    }

    @Bean
    @ConditionalOnMissingBean
    public GaarasonTransactionManager gaarasonTransactionManager() {
        logger.info("-------------------- gaarasonTransactionManager init ------------------");
        return new GaarasonTransactionManager(gaarasonDataSource());
    }
}

请教怎么在多个数据源里让事务可以正常执行。

hawind avatar Jan 13 '22 00:01 hawind

根据报错信息 图片 似乎是标红的类么有找到。

此外,如果同时使用多种orm框架的话,那么在使用诸如@Transactional等spring的注解时,需要注意其中生效的DataSource接口的实现是否符合预期(例如,@Transactional -> GaarasonTransactionManager -> GaarasonDataSource(DataSource的实现)or @Transactional -> xxxxTransactionManager -> DataSource(其他orm框架中对于DataSource的实现))。

xutengx avatar Jan 21 '22 13:01 xutengx

确实是这个提示,但是很奇怪,写了那个方法就会提示,不写就没有。

hawind avatar Jan 22 '22 02:01 hawind

https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java

xutengx avatar Jan 22 '22 09:01 xutengx

@Bean
@ConditionalOnMissingBean
public GaarasonTransactionManager transactionManager() {
    logger.info("-------------------- gaarasonTransactionManager init ------------------");
    return new GaarasonTransactionManager(gaarasonDataSource());
}

可以尝试更改下bean的名称~

xutengx avatar Jan 22 '22 09:01 xutengx

好的,谢谢。

hawind avatar Mar 06 '22 17:03 hawind