java事务遇到try,catch失效的解决办法

2022-08-16 13:07:55

一.首先回顾一下事务的失效场景

1.数据库是否支持事务(mysql的MyIsam不支持事务)

2.注解所在的类是否被加载成Bean

3.注解所在方法是否被修饰为public

4.是否发生自调用问题

5.所用数据源是否加载了事务管理器

6.扩展配置propagation是否正确

7.异常被捕获

8.异常抛出类型不对

其实发生最多就是自身调用、异常被吃、异常抛出类型不对这三个了。

二.在aop配置事务控制或注解 @Transactional控制事务中,try…catch…会使事务失效,那么如何解决呢?

1.可在catch中抛出运行时异常throw new RuntimeException(e)(注:默认回滚的是RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下)

2.手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),使得事务生效,出现异常回滚。

例:

@Transactional(rollbackFor=Exception.class)publicResultupdate(@RequestBodyRestaurantVo entity){Result result=newResult();try{//save(entity);}catch(Exception e){//            throw new RuntimeException(e);TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return result.error(Result.CODE_ADD_FAILED+":"+ e.getMessage());}return result;}
  • 作者:扶我起来继续学习
  • 原文链接:https://blog.csdn.net/qq_42836388/article/details/125423734
    更新时间:2022-08-16 13:07:55