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";
            
        }
  • 相关阅读:
    vika维格表的新 CP ,飞书集成入口上线
    OKR落地四部曲:vika维格表帮你快速养成OKR思维
    ASP.NET, IIS, and Visual Web Developer 技巧与窍门
    VS2008 Tips #008 如何创建ASP.NET Web 用户控件并包含在Web 页面中
    VS2008 Tips #007 如何用 ListView 控件将数据排序
    VS2008 Tips #005 – 如何绑定 ListView 控件
    VS2008 Tip #001 创建、管理和运用样式的强大 CSS 工具
    VS2008 Tips #006 关于“标记导航”的特性
    VS2008 Tips #003 – VS 2008 的拆分视图可以设置为垂直分割
    VS2008 Tips #004 – 您可以通过“浏览方式…”添加浏览器到 Visual Web Developer
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/8064531.html
Copyright © 2011-2022 走看看