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

这篇具有很好参考价值的文章主要介绍了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)

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

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

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

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

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

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


方法【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等等,可以自行再深度学习一下文章来源地址https://www.toymoban.com/news/detail-438680.html

到了这里,关于Java异常和@Transactional(rollbackFor=Exception.class)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包