springboot+mybatis+mysql事务未生效

公司新项目 用的是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手动提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值