文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java异常和@Transactional(rollbackFor=Exception.class)

2023-09-04 13:09

关注

在介绍之前我们先来了解几个Java异常的基本概念。如果你不懂异常,那看完我这篇文章应该很快对异常有了一个大概的了解。

异常:是指阻止当前方法或作用域继续执行的问题。

Throwable类:被用来表示任何可以作为异常被抛出的类,是所有错误或异常的超类。

Throwable 可分为两种类型:

      Error:用来表示系统错误,脱离程序员控制,异常是可以通过修改程序处理的,而错误是不可以通过修改程序处理的。

      Exception:是异常可以被抛出的基本类型,在 Java 类库、用户方法以及运行时故障中都可能抛出 Exception 型异常。

运行时异常(RuntimeException):也称非检查性异常,通常是程序逻辑存在问题引发的异常,程序员本可以避免的异常,编辑器不会检查报错,即使不用try-catch捕获处理,也没有用throws声明抛出,也会编译通过。但是在运行时可能会报错。(如NullPointerException、IndexOutOfBoundsException)

非运行时异常:编译时异常,也称检查性异常,是必须进行处理的异常,如果不处理,程序就不能编译通过,必须使用try-catch捕获处理。(如IOException、SQLException)

接下来说说@Transactional(rollbackFor=Exception.class)

开发过程中,代码检查时经常看到这种提示:

方法【infoPublish】需要在Transactional注解指定rollbackFor或者在方法中显式的rollback。 
Inspection info: 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。 

 点开提示发现其给出三种用法建议:

方法【infoPublish】需要在Transactional注解指定rollbackFor或者在方法中显式的rollback。  Inspection info: 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。             Positive example 1:    @Service    @Transactional(rollbackFor = Exception.class)    public class UserServiceImpl implements UserService {        @Override        public void save(User user) {            //some code            //db operation        }    }Positive example 2:    @Service    public class UserServiceImpl implements UserService {        @Override        @Transactional(rollbackFor = Exception.class)        public void save(User user) {            //some code            //db operation        }    }Positive example 3:    @Service    public class UserServiceImpl implements UserService {        @Autowired        private DataSourceTransactionManager transactionManager;        @Override        @Transactional        public void save(User user) {            DefaultTransactionDefinition def = new DefaultTransactionDefinition();            // explicitly setting the transaction name is something that can only be done programmatically            def.setName("SomeTxName");            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);            TransactionStatus status = transactionManager.getTransaction(def);            try {                // execute your business logic here                //db operation            } catch (Exception ex) {                transactionManager.rollback(status);                throw ex;            }        }    }                

解决方法一:在@Transactional注解后面加上(rollbackFor = Exception.class)

解决方法二:@Transactional注解上不加rollbackFor这个属性,在try-catch中catch里写上回滚方法。

那么,@Transactional注解需不需要加rollbackFor=Exception.class?为什么?

首先,rollbackFor的作用是 可以指定能够触发事务回滚的异常类型。

如果不配置rollbackFor属性,那么该方法只有在遇到运行时异常(RuntimeException)类型的时候才会回滚。

如果某方法加了@Transactional(rollbackFor=Exception.class)这个注解,那么该方法抛出运行时和非运行时异常(任何Exception异常),都会回滚。

如果某方法加了@Transactional(notRollbackFor=RunTimeException.class)这个注解,那么该方法在运行时异常不会回滚。

Transactional还是有很多其他参数,如readOnly、timeout、propagation等等,可以自行再深度学习一下

来源地址:https://blog.csdn.net/xutong_123/article/details/128246994

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯