公司新项目 用的是springboot+mybatis+mysql 未使用springboot的jpa
1
@Configuration
@MapperScan("com.xx.xxx.dao")
@EnableTransactionManagement
public class MyBatisConfiguration {
@Value("${connection.datasource.driver-class-name}")
private String driverClassName;
@Value("${connection.datasource.url}")
private String url;
@Value("${connection.datasource.username}")
private String username;
@Value("${connection.datasource.password}")
private String password;
@Bean(destroyMethod = "close")
@Primary
public DataSource primaryDataSource() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setPoolName("springHikariCP");
hikariDataSource.setDriverClassName(driverClassName);
hikariDataSource.setJdbcUrl(url);
hikariDataSource.setUsername(username);
hikariDataSource.setPassword(password);
return hikariDataSource;
}
@Bean
public DataSourceTransactionManager makeDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
@Bean
public SqlSessionFactory makeSqlSessionFactoryBean(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("com.xx.xxx.domain");
return sessionFactory.getObject();
}
}
以及在application.properties配置数据源
其余与正常spring下的mybatis一致
后来发现事务未生效 明明错误的却没有回滚 但是配置均正确。
在排除是配置的问题后,想起来mysql的表需要时innodb才能支持事务,改表为innodb引擎后,发现仍然是一个sql提交一次。
是因为mysql的autocommit的问题。当其为1的时候表示自动提交,即一个sql提交一次事务,所以出错后之前的sql未回滚。
于是在mysql服务器的配置中(/etc/my.cnf)加上一行init_connect='SET autocommit=0' 重启mysql服务(service mysqld restart)后 发现事务回滚生效,spring手动提交