zoukankan      html  css  js  c++  java
  • 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务

    Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。

    checked异常:

    表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。
    必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。

    阿里编码规约示例:

    Severity
       Major
    
    Message
       事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
    
    Examples
       
    Positive example 1/**
         * @author caikang
         * @date 2017/04/07
         */
        @Service
        @Transactional(rollbackFor = Exception.class)
        public class UserServiceImpl implements UserService {
            @Override
            public void save(User user) {
                //some code
                //db operation
            }
        }   
    Positive example 2/**
         * @author caikang
         * @date 2017/04/07
         */
        @Service
        public class UserServiceImpl implements UserService {
            @Override
            @Transactional(rollbackFor = Exception.class)
            public void save(User user) {
                //some code
                //db operation
            }
        }   
    Positive example 3/**
         * @author caikang
         * @date 2017/04/07
         */
        @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;
                }
            }
        }   
  • 相关阅读:
    Java学习笔记2.Java标识符和基本数据类型
    Java面试题库(四)
    Eclipse最常用的一些快捷键技巧
    心理学166个现象(很多,别一次看完!)[119]
    Java学习笔记1.Java发展及JDK配置
    SQL操作全集
    J2EE面试题库
    Java面试题库(一)
    Java程序员,面试必读
    Java面试题库(二)
  • 原文地址:https://www.cnblogs.com/miye/p/7997572.html
Copyright © 2011-2022 走看看