0


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

在介绍之前我们先来了解几个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)这个注解,那么该方法在运行时异常不会回滚。

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

标签: spring java 后端

本文转载自: https://blog.csdn.net/xutong_123/article/details/128246994
版权归原作者 Ddd_victory 所有, 如有侵权,请联系我们删除。

“Java异常和@Transactional(rollbackFor=Exception.class)”的评论:

还没有评论