博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSM事务——事务回滚如何拿到返回值
阅读量:5342 次
发布时间:2019-06-15

本文共 2335 字,大约阅读时间需要 7 分钟。

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";            }

 

转载于:https://www.cnblogs.com/lemon-flm/p/8064531.html

你可能感兴趣的文章
ACE admin 后台管理框架
查看>>
ASP.NET Core学习之二 菜鸟踩坑
查看>>
转:redis windows下的环境搭建
查看>>
改变图片效果
查看>>
Python的数据类型--数字--字符串
查看>>
session的方法
查看>>
Lucene的步骤
查看>>
spring的依赖注入
查看>>
redis 的安装
查看>>
C++ 中 new 操作符内幕:new operator、operator new、placement new
查看>>
你可能忽略的json的坑!!!
查看>>
CentOS 安装man man-pages
查看>>
Ubuntu配置SSH服务器
查看>>
数据类型转换
查看>>
[Knowledge-based AI] {ud409} Lesson 11: 11 - Classification
查看>>
appium 获取微信webview设置
查看>>
vs编译完提示不支持尝试的执行操作
查看>>
clock函数学习链接
查看>>
java POi excel 写入大批量数据
查看>>
linux下修改tomcat使用的jdk版本
查看>>