在介绍之前我们先来了解几个Java异常的基本概念。如果你不懂异常,那看完我这篇文章应该很快对异常有了一个大概的了解。
1、异常:是指阻止当前方法或作用域继续执行的问题。
2、Throwable类:被用来表示任何可以作为异常被抛出的类,是所有错误或异常的超类。
3、Throwable 可分为两种类型:
Error:用来表示系统错误,脱离程序员控制,异常是可以通过修改程序处理的,而错误是不可以通过修改程序处理的。
Exception:是异常可以被抛出的基本类型,在 Java 类库、用户方法以及运行时故障中都可能抛出 Exception 型异常。
4、运行时异常(RuntimeException):也称非检查性异常,通常是程序逻辑存在问题引发的异常,程序员本可以避免的异常,编辑器不会检查报错,即使不用try-catch捕获处理,也没有用throws声明抛出,也会编译通过。但是在运行时可能会报错。(如NullPointerException、IndexOutOfBoundsException)
5、非运行时异常:编译时异常,也称检查性异常,是必须进行处理的异常,如果不处理,程序就不能编译通过,必须使用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的作用是 可以指定能够触发事务回滚的异常类型。
1、如果不配置rollbackFor属性,那么该方法只有在遇到运行时异常(RuntimeException)类型的时候才会回滚。
2、如果某方法加了@Transactional(rollbackFor=Exception.class)这个注解,那么该方法抛出运行时和非运行时异常(任何Exception异常),都会回滚。
3、如果某方法加了@Transactional(notRollbackFor=RunTimeException.class)这个注解,那么该方法在运行时异常不会回滚。文章来源:https://www.toymoban.com/news/detail-438680.html
Transactional还是有很多其他参数,如readOnly、timeout、propagation等等,可以自行再深度学习一下文章来源地址https://www.toymoban.com/news/detail-438680.html
到了这里,关于Java异常和@Transactional(rollbackFor=Exception.class)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!