zoukankan      html  css  js  c++  java
  • SSM事务——事务回滚如何拿到返回值

    MySQL数据库一共向用户提供了包括BDB、HEAP、ISAM、MERGE、MyISAM、InnoDB以及Gemeni这7种Mysql表类型。其中BDB、InnoDB属于事务安全类表,而其他属于事务非安全类表。

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

    问题:在service层出现异常需要回滚,但是有一个值必须返回给service的调用者,不知道该如何及回滚,又可以正常返回值

               通过自定义一个异常传递数据

    1、通过抛出异常,会回滚,但是拿不到想到的返回结果

    @Transactional
        @Override
        public int AddUser(User users) throws UserException  {
            // TODO Auto-generated method stub
            int i=0;
            try {
                userMapper.AddUser(users);
                int a=6/0;
                userMapper.AddUser(users);
                
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("会回滚,但 拿不到值...");
            }
            return i;
        }

    2、通过finally{}返回结果,但是事务不会回滚

    // finally 没有抛出异常给spring,spring不会操作回滚
    @Transactional @Override
    public int AddUser(User users) throws UserException { // TODO Auto-generated method stub int i=0; try { userMapper.AddUser(users); int a=6/0; userMapper.AddUser(users); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("不会回滚,可以 拿值..."); } finally{ //这样就不能 回滚了 return i; } }

    3、定义一个runtimeException ,可以传递 数据

    public class UserException extends RuntimeException {
        /*
         * 自定义 异常 RuntimeException 
         */
        public UserException(String s){
            super(s);
        }
    }
    
    
    
    @Transactional
        @Override
        public int AddUser(User users) throws UserException  {
            // TODO Auto-generated method stub
            int i=0;
            try {
                userMapper.AddUser(users);
                int a=6/0;
                userMapper.AddUser(users);
                
            } catch (Exception e) {
                e.printStackTrace();
                throw new UserException("可以传递想要的值,拿到值");
            }
            return i;
        }

    这样在Controller层就可以通过catch 的 e.getMessage()  拿到值了

    @RequestMapping("/addUser")
        public String addUser(){
            User user=new User();
            try {
                userService.AddUser(user) ;
            } catch (Exception e) {
                //拿到  事务回滚并 传递的值
                System.out.println(e.getMessage());
            }
            return "redirect:/user/findAll.action";
            
        }
  • 相关阅读:
    linux下安装jmeter
    Jmeter 跨线程组传递参数 之两种方法
    Jmeter之Json Path Extractor 接受上一个请求的响应参数
    Jmeter之添加响应断言,bean shell post processor
    Jmeter 分布式压力测试
    Jmeter之一个请求获取上一个请求的参数
    selenium自动化测试实例
    SqlBulkCopy类进行大数据(一万条以上)插入测试
    SqlServer存储过程传入Table参数
    Asp.Net EF Code First 简单入门
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/8064531.html
Copyright © 2011-2022 走看看