作者最近在用spring整合mybatis的时候碰到一个问题就是开启声明式事务之后发现事务不生效,出现异常之后不回滚,在网上查阅很多资料后都没有成功解决。最后仔细检查代码之后发现SqlSessionFactoryBean和事务SqlSessionTemplate用的不是一个数据源导致事务没有生效。
//数据源
@Bean
public DataSource dataSource() throws Exception {
Properties properties = new Properties();
InputStream resource = SpringConfig.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(resource);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
return dataSource;
}
代码修改为这样就可以了,用同一个数据源。
//@Autowired DataSource darrSource自己寻找注入到bean
@Bean()
public SqlSessionFactoryBean sqlSessionFactory(@Autowired DataSource darrSource) {
SqlSessionFactoryBean sqlSessionFactoryBuilder = new SqlSessionFactoryBean();
sqlSessionFactoryBuilder.
setConfigLocation( new PathMatchingResourcePatternResolver().getResource("mybatis-config.xml"));
sqlSessionFactoryBuilder.setDataSource(darrSource);
return sqlSessionFactoryBuilder;
}
mybatis事务使用的数据源
//@Autowired DataSource darrSource自己寻找注入到bean
@Bean
public TransactionManager transactionManager(@Autowired DataSource darrSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(darrSource);
return transactionManager;
}
查看数据源源码发现每次调用数据源方法都会调用new所以导致出现问题
//每次调用都会创建新的数据源
@SuppressWarnings("rawtypes")
public static DataSource createDataSource(Map properties) throws Exception {
DruidDataSource dataSource = new DruidDataSource();
config(dataSource, properties);
return dataSource;
}