在没有配置多数据源之前,我在service层的方法上加@Transactional是可以正常回滚的。而在我配置了多数据源后,原来的事务都失效了,我还不知道是因为多数据源导致失效的,因此我在网上搜了很久,什么方法都执行了一遍,但是都没有效果。
最后我发现我是在配置了多数据源后才出现这种现象的,我就从多数据源的配置文件下手
加上以下这段,针对动态数据源的事物控制,可以成功回滚。
@Bean
public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) {
return new DataSourceTransactionManager(dynamicDataSource);
}
public class DynamicDbConfig {
private static String MYBATIS_CONFIG = "/mybatis-config.xml";
/** * mybatis mapper resource 路径 */
private static String MAPPER_PATH = "/mapping/**/*.xml";
private final DataSource dynamicDS;
@Autowired
public DynamicDbConfig(DataSource dynamicSource) {
this.dynamicDS = dynamicSource;
}
@Bean
public SqlSessionFactory dynamicSqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setConfigLocation(new ClassPathResource(MYBATIS_CONFIG));
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + MAPPER_PATH;
factoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
factoryBean.setDataSource(dynamicDS);
return factoryBean.getObject();
}
****/**
* 一定要加上这个,不然事务回滚失效
* @param dynamicDataSource
* @return
*/
@Bean
public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) {
return new DataSourceTransactionManager(dynamicDataSource);
}
}
在开启事务的方法上指定transactionManager (按你命名的写)
@Override
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public int addFrom(FromModel fromModel) throws BusinessException, ParseException {
.........
}