框架springboot2,数据库中间件为mybatis,用druid管理多数据源
1、尝试解决问题
在处理事务的时候遇到问题,首先按照网上查询到的资料进行了如下配置:
1) 在启动类上增加@EnableTransactionManagement注解
2)配置文件里增加:spring.transaction.rollback-on-commit-failure=true 配置
3)在service实现类上面增加 @Transactional(rollbackFor = Exception.class) 注解,意思是只要发生异常事务就回滚
4)try catch里 增加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
按照上面几个步骤配置后,事务依旧没有生效,查阅很多资料后,发现可能是多数据源配置影响事务处理
2、解决问题最终方案
在 @Transaction 注解里面可以指定事物管理器,但是需要手动配置mysql事务管理器的bean
如下图,使用druid管理多数据源会有相应的配置文件,以一个配置文件举例,这里是配置数据库相关配置的类,里面定义了事务bean,我们需要使用该事务管理器,只需要在 @Transactional(rollbackFor = Exception.class) 注解中,增加一个value=“事务管理器定义bean名” 指定该事务管理器作为事务管理用途即可。
package com.laibutec.app.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
public class DataSourcConfig {
@Bean(name = "transactionManager")
public DataSourceTransactionManager dataSourceTransactionManagerOne(@Qualifier("dataSourceapp") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
这里指定事务管理器
@Transactional(value = "transactionManager")
通过以上配置后,终于可以正常使用事务了,在此记录一下。