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";
}
SSM事务——事务回滚如何拿到返回值的更多相关文章
- Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因
1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...
- flask-sqlalchemy、pytest 的单元测试和事务自动回滚
flask-sqlalchemy.pytest 的单元测试和事务自动回滚 使用 flask-sqlalchemy 做数据库时,单元测试可以帮助发现一些可能意想不到的问题,像 delete-cascad ...
- spring + myBatis 常见错误:注解事务不回滚
最近项目在用springMVC+spring+myBatis框架,在配置事务的时候发现一个事务不能回滚的问题. 刚开始配置如下:springMVC.xml配置内容: spring.xml配置内容 从上 ...
- 抛出自定义异常,spring AOP事务不回滚的解决方案
spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...
- spring + mybatis 注解式事务不回滚的原因分析 @Transactional
在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...
- Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题
最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了....... 为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...
- MySql事务无法回滚的原因
使用MySQL时.假设发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时.不要苦恼,先看看MySQL创建的表有没有问题.即表的类型. InnoDB和MyISAM是在使 ...
- springmvc注解式事务手动回滚
Spring的AOP事务管理默认是针对unchecked exception回滚(运行期异常,Runtime Exception),如果希望手动控制事务的回滚,可以通过 TransactionAspe ...
- Spring事务不回滚原因分析
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离. 在我完成一个项目的时候,遇到了一个Spring事务不回滚的问题,通过aspectJ和@Transacti ...
随机推荐
- POJ3176--Cow Bowling(动态规划)
The cows don't use actual bowling balls when they go bowling. They each take a number (in the range ...
- STL容器(C11)--unordered_map用法
http://www.cplusplus.com/reference/unordered_map/unordered_map/
- 18、标准IO库详解及实例
标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...
- 最短路 模板 【bellman-ford,dijkstra,floyd-warshall】
Bellman-ford: /* bellman ford */ #include <iostream> #include <cstdio> #include <cstr ...
- SRM467
250pt: 一个学生等老师来上课的,但是他不知道老师啥时候会来的,然后他等waiting时间后觉得无聊就会出去转walking时间,回来等待waiting时间后老师没来就会再次出去.老师会在a... ...
- iOS开发中与库相关的术语
动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime
- oc门
OC门电路,即集电极开路输出结构门电路,电路结构图为:
- Android-Retrofit-2.0-Post与Get-请求有道词典翻译
Retrofit-2.0版本后,内置已经集成了OKHttp,在使用Retrofit的时候 看似是Retrofit去网络请求的 实际上Retrofit只是封装,所以不要以为Retrofit是网络请求框架 ...
- Spring中ApplicationEvent和ApplicationListener封装
1.测试程序EventTest.java,发布一个事件只需要调用FrameEventHolder.publishEvent()方法即可. package com.junge.spring.event; ...
- WPF放大镜效果
在做WPF项目中,不止两个项目需要有放大镜功能. 第一个项目是一个手术室的远程示教系统,主要是为了方便专家演示病症时,可以放大图片上的某些部位. 第二个项目是一个工厂的MES项目,其中有个功能是质量预 ...