Java异常和@Transactional(rollbackFor=Exception.class)
在介绍之前我们先来了解几个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