springboot+mybatis+mysql事务未生效

来源:互联网 发布:机动战士高达age知乎 编辑:程序博客网 时间:2024/06/03 05:23

公司新项目 用的是springboot+mybatis+mysql 未使用springboot的jpa

1

@Configuration@MapperScan("com.xx.xxx.dao")@EnableTransactionManagementpublic 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手动提交

0 0