• 事务场景中,抛出异常被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;
                }
            }
        }   
  • 相关阅读:
    vsftpd文件服务参数汇总和虚拟用户使用
    MHA实现mysql高可用复制集群
    mysqldump备份与基于bin-log实现完全恢复
    MySQL的日志相关内容
    MySQL(mariadb)主从复制模式与复制过滤
    MySQL(mariadb)多实例应用与多实例主从复制
    DNS的主从,转发与负载功能
    Spring 自动代理
    Jquery Validate 使用记坑
    动态代理
  • 原文地址:https://www.cnblogs.com/miye/p/7997572.html
Copyright © 2020-2023  润新知