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;
                }
            }
        }   
  • 相关阅读:
    UE 不生成.bak文件
    DOTWeen 使用
    unity admob
    UGUI 判断元素进入舞台
    unity 解决ScrollRect嵌套滚动问题
    oc字符串与c字符串转换和拷贝
    Object-c中的单例
    JAVA比较两个List集合的方法
    CentOS 7 配置静态IP
    CentOS7安装Jdk1.8
  • 原文地址:https://www.cnblogs.com/miye/p/7997572.html
Copyright © 2011-2022 走看看