代码虐我千百遍,我待代码如初恋
问题背景: springboot + mybatis, 多数据源, 事务无法回滚
网上查阅了各种博客
第一种说法(个人觉得这个真的非常规):
mapper.xml文件中 条件判断错误,类似这种
nmpa_id,
说是字段不存在,查之,非问题所在
其他说法:
常规@Transactional的相关错误,这一块的各种博客非常多,解释的也很详细,总结一下大致以下,不清楚的可以自行搜索.
1.方法必须是public
2.内部调用的问题
3.异常要抛出来,不要try catch 处理掉了
4.抛出的异常不支持回滚,unchecked什么的
然后就是各种我查询的配置的相关问题
1.启动类要加@EnableTransactionManagement
2.application.yml 要加
spring:
transaction:
rollback-on-commit-failure: true
3.要配置sqlsessionfactory
4.要配置transactionManage
问题的初始是,根本就没有事务,就算加了@transaction标签,也没有事务,
于是有人说不同的数据源要配不同的transactionManager,于是有了如下错误配置
//@Bean(name = TransManageType.SQLSERVER)
//@Primary
public DataSourceTransactionManager mssqlTransactionManager(@Qualifier("sqlserverDataSource") DataSource sqlserverDataSource)
{
return new DataSourceTransactionManager(sqlserverDataSource);
}
//@Bean(name = "mssqlErpTransactionManager")
public DataSourceTransactionManager mssqlErpTransactionManager(@Qualifier("sqlserverErpDataSource") DataSource sqlserverErpDataSource)
{
return new DataSourceTransactionManager(sqlserverErpDataSource);
}
这里确实是配了不同的数据源,也是这里配置了之后,出现了明明已经加入了事务,为什么就不回滚的问题springboot+mybatis不能回滚
最终问题解决(正确配置):
@Bean
public PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource)
{
return new DataSourceTransactionManager(dynamicDataSource);
}
没有配多事务管理,也可能是这个加入了动态了数据源后,spring自动根据数据源切换,进行事务的切换吧,具体源码没有深究,不过最终问题解决了.
springboot的sqlsessionFactory配置,其实在application.yml文件中就能配置了,也就是下面这一段
# MyBatis
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.xxx
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml