为了账号安全,请及时绑定邮箱和手机立即绑定

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

  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 回答

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

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

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

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

第二段代码就可以成功。

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

0 回复 有任何疑惑可以回复我~
#1

慕斯9756157 提问者

谢谢啦,分析的有理有据,受教了!
2018-09-04 回复 有任何疑惑可以回复我~

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

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

0 回复 有任何疑惑可以回复我~
#1

慕斯9756157 提问者

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

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信