老师,我是江苏的小伙伴,我遇到一个事务回滚的问题,不知道是不是我的数据库版本问题

来源:8-5 整合MyBatis - 引入事务执行回滚

慕斯9756157

2018-06-16 10:25

  1. 我先说下我的环境差异吧:springboot的版本是一样的2.0

  2. 数据库我的是mysql8.0

  3. 依赖是<dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.11</version>
    </dependency>
  4. 我在service层用了@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)
  5. 但是没有生效我以为没有开启事务,还在启动入口加了@EnableTransactionManagement
  6. 都没有回滚
  7. 我最后在切面里改了点东西就可以了,我是这样改的catch(Exception e){
       log.error("日志记录发生错误, errorMessage: {}", e.getMessage());
       throw  e;
    }
  8. 然后发现事物就起作用了,不知道这样改行不行,springboot的事务机制是不能通过切面拦截吗?
  9. 希望老师解决下我的问题,谢谢啦~
写回答 关注

2回答

  • weibo_sJ书桀
    2018-08-17 21:03:22
    已采纳

    重点就在于你切面里面的throw e;应该@Transactional原理也是切面捕获异常,如果你的切面在@Transactional之前将异常给捕获了并且不抛出,那么事务就会失效。

    你可以写这么两段代码(以下为伪代码)比较一下:

    @Transactional
    try{
    install
    1/0
    }catch(...){
    sout("异常")
    }
    @Transactional
    try{
    install
    1/0
    }catch(...){
    sout("异常")
    throw new Exception()
    }

    第一段代码因为已经把异常捕获了,不抛出,所以事务失效。

    第二段代码就可以成功。

    由此问题可以得到一个开发规范就是,项目中必须要有自定义异常,在每一个try catch里面都必须抛出一个自定义异常

    慕斯9756...

    谢谢啦,分析的有理有据,受教了!

    2018-09-04 08:10:36

    共 1 条回复 >

  • 慕勒4598770
    2018-06-16 12:18:39

    1、只有在运行时异常时才支持回滚

    2、数据库引擎是InnoDB才支持事物

    慕斯9756...

    按照你的指点,我检查了一下哦,第一点我用的是1/0,属于运行时异常; 第二点,我去数据库查了下show variables like '%storage_engine%';发现数据库是{default_storage_engine:InnoDB} 还有哪些可能导致老师的代码在我的环境无法正常回滚呢,另外我的修改对不对呢

    2018-06-16 13:29:06

    共 1 条回复 >

SpringBoot开发常用技术整合

SpringBoot 极简开发的框架整合利器

102171 学习 · 508 问题

查看课程

相似问题