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. (动态规划)免费馅饼--hdu--1176

    http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  2. java基本语法、标识符、关键字

    基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...

  3. [转]Windows中使用命令行方式编译打包Android项目

    http://my.oschina.net/liux/blog/37875 网上很多用Ant来编译打包Android应用的文章,毕竟Ant是纯Java语言编写的,具有很好的跨平台性.今天想写个纯win ...

  4. 再论hibernatetemplate

    自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢? 1. ...

  5. hdu 5092 线裁剪(纵向连线最小和+输出路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=5092 给一个m*n的矩阵,找到一个纵向的"线"使得线上的和最小并输出这条线,线能向8个方向延 ...

  6. POJ3046选蚂蚁创建集合_线性DP

    POJ3046选蚂蚁创建集合 一个人的精力是有限的呢,如果一直做一件事迟早会疲惫,所以自己要把握好,不要一直埋头于一件事,否则效率低下还浪费时间 题目大意:一共有T(1,2...n为其种类)种蚂蚁,A ...

  7. Objective-C与Swift混编

    1,创建项目(比如你先选择Objective-C) 2,项目创建成功后接着创建一个swift类  3,Xcode会弹出提示框问你需不需要创建桥接文件(桥接文件的名称默认为:项目名称-Bridging- ...

  8. CentOS下双网卡绑定-bond0

    网卡绑定就是多张网卡逻辑上作为一张网卡用.可分为,负载均衡绑定和冗余绑定两种. 加载bonding驱动   #modprobe bonding 1.编辑虚拟网络接口配置文件 [root@test~]# ...

  9. AlexNet详解3

    Reference. Krizhevsky A, Sutskever I, Hinton G E. ImageNet Classification with Deep Convolutional Ne ...

  10. Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 问题分析

    Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again Loaded pl ...