关于抛异常事务回滚的测试

TestController.java 代码如下***:
/**
* 测试异常回滚.
* @return
*/
@RequestMapping(value = "/testExceptionRollBack")
@ResponseBody
public String testExceptionRollBack() {
List<String> idList = Lists.newLinkedList();
idList.add("1111111111");
idList.add("2222222222");
idList.add("3333333333");
try {
return orderService.testUpdateStatus(idList);
} catch (Exception e) {
logger.error("执行失败", e);
return "执行失败";
}
}

TestService.java 代码如下***:
public String testUpdateStatus(List<String> idList) throws Exception {
List<Order> orderList = orderDao.listByIds(idList);
if (!orderList.isEmpty()) {
int index = 1;
for (Order order : orderList) {
try {
requestDataService.insert("URL",
"ttt", "测试异步", "测试成功", Common.FLAG_Y, 1, order.getOrderCode());
if ("PO1805060174".equals(order.getOrderCode())) {
throw new RuntimeException("测试此单据抛异常事务回滚");
} else {
TestOccupation occu = new TestOccupation();
occu.setStorageAreaId(order.getStorageAreaId());
occu.setCommodityCode("TT" + index);
occu.setDocumentCode(order.getOrderCode());
occu.setOccupiedQty(order.getTotalQty());
occu.setCreateDate(new Date());
occu.setCreateUserId(OpmUser.INTERFACE_USER_ID);
occu.setDocumentId(order.getOrderId());
occu.setDocumentDetailId(order.getOrderId() + "" + index);
testOccupationDao.add(newDocumentOccupation);
}
index++;
} catch (Exception e) {
logger.error("执行异常", e);
}
}
}
return null;
}

结论: 经过测试发现, 程序在运行的时候抛出一个运行时异常, 事务并不会回滚, 请求信息依然保存到了DB.
接下来看另一种现象, TestController还是不变, 将TestService的
【throw new RuntimeException("测试此单据抛异常事务回滚");】 修改如下:
【entityService.testException("PO1805060174");】
EntityService.java 代码如下***:
public void testException(String code) throws Exception {
if (TextUtils.isNotEmpty(code)) {
throw new RuntimeException("测试在另一个service发出一个异常");
}
}

结论: 经过测试发现, 程序运行中执行到抛异常后整个事务会回滚, 请求信息都没有保存到DB中,
这就意味着调用的子方法在另外一个service中的时候抛异常即便捕获了仍然会抛异常.接下来再将
requestDataRecordService的方法 insert 加个异步的注解, 代码如下***:

@Async
public void insert(***) {
}

结论: 经过再次测试得出, requestDataService.insert 存入到DB中了,但是inventoryDocumentOccupationDao.add 没有存入DB,
证明加了异步方法的注解标识后, 此方法不会被回滚.接下来再将EntityService代码修改如下***:

public void testException(String code) throws Exception {
try {
if (TextUtils.isNotEmpty(code)) {
throw new RuntimeException("测试在另一个service发出一个异常");
}
} catch (Exception e) {
logger.error("测试异常", e);
}
}

结论: 再继续测试, 发现在【原始抛异常的地方进行捕获】后事务就不会回滚, 请求信息被存入了DB中.

备注: 测试的项目使用的框架: SpringMVC + Spring + mybatis

原文地址:http://blog.51cto.com/9381188/2324765

时间: 2024-10-06 00:21:10

关于抛异常事务回滚的测试的相关文章

检查时异常和运行是异常 + 事务回滚

检查时异常checked Exception 是编译检查时候就能发现的异常.这个能在try catch中处理,就在try catch 中处理. 运行时异常(Runtime Exception),是程序遇到了问题,需要停下.这个不用try catch 处理,因为遇到这个程序就停下了...... spring框架中能默认回滚的异常时 Runtime Exception. 需要在方法上添加 @Transactional(rollbackFor={Exception.class}) 此文为笔记 参考链接

PHP 事务回滚实例

#若已存在该表,就将其删除:否则创建新的表.DROP table IF EXISTS users;CREATE TABLE users( `user_name` varchar(5) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8; #若已存在该存储过程,就将其删除:否则创建新的存储过程DROP PROCEDURE IF EXISTS inserOrUpdate;CREATE PROCEDURE inserOrUpdate()BEGIN#----

(转)spring异常抛出触发事务回滚策略

背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 测试用业务逻辑方法: /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exceptio

Spring事务管理只对出现运行期异常进行回滚

使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作.那么什么是检查型异常什么又是非检查型异常呢?最简单的判断点有两个:1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类). 2.对非检查型类

用Spring TestContext 做带事务回滚的JUnit测试

JUnit单元测试框架很常用 但可能会破坏数据库现场 以及大量的硬编码出现(applicationContext.getBean("")); 今天哥们给新手介绍一下 Spring Test这个Spring自带的jar包中的一些注解 实现单元测试+事务回滚+注解依赖注入 网上的相关教程不多 我的意思是有用的不多 基本都是类似api文档那种 给你罗列一大堆注解和类 告诉你他们的作用 你看完了也不知道该从哪里入手 我自己琢磨了几天(哥们天赋不是很高) 写了一个测试类 测试成功 给大家分享一下

springmvc事务回滚失效

转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTemplate.搭框架时,发现了一个事务无法正常回滚的问题,记录如下: 首先展示问题: Spring applicationContext.xml配置: [html] view plaincopy <bean id="dataSource" class="org.spring

Spring @Transactional ——事务回滚

工作原理运行配置@Transactional注解的测试类的时候,具体会发生如下步骤1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中.在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]2)事务结束时,回滚在第1步骤中得到的代理conne

Transactional 事务回滚 分析

Spring的AOP事务管理默认是针对unchecked exception回滚(运行期异常,Runtime Exception). unchecked ,就是不用手工写try catch的exception Exception作为基类,下面还分checked exception和unchecked exception.如果客户端可以通过其他的方法恢复异常,那么这种异常就是checked exception:如果客户端对出现的这种异常无能为力,那么这种异常就是Unchecked exceptio

经验总结55--spring开启事务回滚

使用spring的@Transactional注解,异常时,进行事务回滚. 1.引用 xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 2.开启事务 <tx:annotation-driven transaction-manager=&q