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

SSM事务——事务回滚如何拿到返回值的更多相关文章

  1. Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因

    1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...

  2. flask-sqlalchemy、pytest 的单元测试和事务自动回滚

    flask-sqlalchemy.pytest 的单元测试和事务自动回滚 使用 flask-sqlalchemy 做数据库时,单元测试可以帮助发现一些可能意想不到的问题,像 delete-cascad ...

  3. spring + myBatis 常见错误:注解事务不回滚

    最近项目在用springMVC+spring+myBatis框架,在配置事务的时候发现一个事务不能回滚的问题. 刚开始配置如下:springMVC.xml配置内容: spring.xml配置内容 从上 ...

  4. 抛出自定义异常,spring AOP事务不回滚的解决方案

    spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...

  5. spring + mybatis 注解式事务不回滚的原因分析 @Transactional

    在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...

  6. Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题

    最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...

  7. MySql事务无法回滚的原因

    使用MySQL时.假设发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时.不要苦恼,先看看MySQL创建的表有没有问题.即表的类型. InnoDB和MyISAM是在使 ...

  8. springmvc注解式事务手动回滚

    Spring的AOP事务管理默认是针对unchecked exception回滚(运行期异常,Runtime Exception),如果希望手动控制事务的回滚,可以通过 TransactionAspe ...

  9. Spring事务不回滚原因分析

    Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离. 在我完成一个项目的时候,遇到了一个Spring事务不回滚的问题,通过aspectJ和@Transacti ...

随机推荐

  1. linux 修改ip 地址

    1./etc/sysconfig/network-scripts/ifcfg-网卡 如果是新网卡 自己写配置文档 ip a 即可查看网卡名字 (这是eno16777736) BOOTPROTO= dh ...

  2. CentOS 5.8下快速搭建FTP服务器

    学习安装和配置vsftpd: 实验环境:CentOS 5.8 x86_64 测试环境关掉防火墙和selinux. service iptables stop setenforce 0 1.安装vsft ...

  3. spring父子Ioc容器的关系

    在网上找了一下,没有直接解说ioc父子容器关系的文章,所以大概看了下代码,自己写下吧,写俩行做个笔记. 1. 在进行dean的注册的时候,父容器和子容器是互不干扰的,各自注册自己的 2. 在实例化的时 ...

  4. js反选

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. jQuery插件初级练习1

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  6. AngularJS 启动执行过程

    一.浏览器下载HTML/CSS/JavaScript等 当你转到一个页面地址后,浏览器先回下载这个HTML,同时,会开启一些辅助线程下载所关联的script标签和link标签里引用的文件. 二.浏览器 ...

  7. [php]PHP_函数收集

    //http://php.net/manual/en/control-structures.break.php //break ends execution of the current for, f ...

  8. Android-Java-面向对象的代码例子

    需求一:用手机打电话,发短信,看视频,听音乐,用面向对象思想实现: package android.java.oop01; /** * 1.既然是面向/面对 --> 对象 就要把 (用手机打电话 ...

  9. 判断闰年的Java算法

    判断方法 普通年能被4整除且不能被100整除的为闰年. 世纪年能被400整除的是闰年 对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年.如172800年是闰年,86400年不 ...

  10. 实验6 LCD接口

    1.利用单片机控制LCD1602,在LCD1602上显示字符串,并使其整屏左移. #include<reg51.h> #define uchar unsigned char #define ...