• 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";
            
        }
  • 相关阅读:
    微信转发或分享朋友圈带缩略图、标题和描述的实现方法
    apache一个IP多个站点的配置方法
    微信网页扫码登录的实现
    laravel take(3) 读取最近三条信息
    微信卡劵、微信卡包,必须是认证订阅号或认证服务号
    CSS3 去除苹果浏览器按钮input[type="submit"]和input[type="reset"]的默认样式
    使用laravel5.4结合easywechat进行微信开发--基本配置
    Class 'QrCode' not found ? 和 laravel 生成二维码接口(Simple QrCod)
    windows redis的启动 和 Laravel中Redis的使用
    改变checkbox的默认样式
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/8064531.html
Copyright © 2020-2023  润新知