Spring transaction事务之roll back回滚
转载自:http://blog.csdn.net/lovejavaydj/article/details/7635848
试验方法:
写一个单元测试,调用一个service层方法(发生对数据库进行写操作的方法--insert、update、delete)即可.
试验过程:
定义一个service方法如下:
public SMSTiming createSMSTiming(SMSTiming smsTiming){
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
return s;
}
定义二个异常(先默认配置TestException为Spring事务回滚异常):
publicclass MyTestException extends Exception
publicclass TestException extends Exception
注意看下:每次这个方法的不同处(抛出的异常不同)。
测试1:
public SMSTiming createSMSTiming(SMSTiming smsTiming){
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
int i = 4/0; //人为产生异常(实际这里抛出了ArithmeticException运行异常)
return s;
}
测试1结果:会事务回滚----数据库中未插入新数据。
测试2:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws Exception{//受检异常(非运行异常)必须抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownew Exception ("");//抛出Exception异常
}
return s;
}
测试2结果:不会事务回滚----数据库中插入新数据。
测试3:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws RuntimeException{//运行异常(非受检异常)可以不抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewRuntimeException("");//抛出RuntimeException异常
}
return s;
}
测试3结果:会事务回滚----数据库中未插入新数据
测试4:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws TestException{//受检异常(非运行异常)必须抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewTestException("");//抛出TestException异常
}
return s;
}
测试4结果:会事务回滚----数据库中未插入新数据。
测试5:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws MyTestException{//受检异常(非运行异常)必须抛出
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewMyTestException("");//抛出MyTestException异常
}
return s;
}
测试5结果:不会事务回滚----数据库中插入新数据。
测试6:
public SMSTiming createSMSTiming(SMSTiming smsTiming) throws MyTestException{//受检异常(非运行异常)必须抛出 (注意:此时spring指定配置此异常回滚)
SMSTiming s= this.getSmsTimingDAO().createSMSTiming(smsTiming);
try{
int i = 4/0; //人为产生异常
}catch(Exception e){
thrownewMyTestException("");//抛出MyTestException异常
}
return s;
}
测试6结果:会事务回滚----数据库中未插入新数据。
试验总结:
测试1、测试3、测试4、测试6会进行事务回滚;测试2、测试5不会进行事务回滚。
为什么会这样?因为是异常的类型(受检异常、运行时异常)不同或使用了Spring的rollback-for配置。
测试1和测试3是因为抛出了运行时异常,会事务回滚。
测试4和测试5、测试6分别抛出受检异常TestException、MyTestException,那为什么测试4和测试6会事务回滚呢?
因为是我们在Spring事务配置中指定了此异常(指定rollback-for)。
Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出一个 RuntimeException或其子类例的实例时。(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚
资料:
1. http://hi.baidu.com/thrunder_liu/blog/item/e3a5b60132b31281e950cd87.html
2. http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html
Spring transaction事务之roll back回滚的更多相关文章
- sql事务(Transaction)用法介绍及回滚实例
sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...
- MySql数据库事务正常提交,回滚失败
问题:在初次练习Mysql数据库事务时,事务正常提交,但是在遇到异常应当回滚时,回滚失败. 代码如下: //2.更新操作. public void update(Connection conn, St ...
- SpringBoot统一异常处理后TX-LCN分布式事务无法捕获异常进行回滚
通常我们使用SpringBoot都会进行统一异常处理,例如写一个BaseController,在BaseController里进行统一异常处理,然后其他的Controller都继承BaseContro ...
- Spring transaction事务 roll back各种回滚
Spring的AOP事务管理默认是针对unchecked exception回滚. 也就是默认对RuntimeException()异常极其子类进行事务回滚. Exception作为基类,下面还分ch ...
- spring @Transaction事务回滚失败
今天客户提出一个新问题,出库一批商品,提示失败了,但是库存数量却减少了.看了一下代码一头雾水,我们的代码加了事物,且捕获异常. 经过调试代码发现就是两个原因导致的 第一.在当前方法的catch中处理了 ...
- spring事务不会进行回滚的情况
if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Excep ...
- spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); //设置手动回滚 TransactionAsp ...
- spring data jpa使用@Transactional注解开启事务后失败不回滚
如题,在数据库批量操作方法上使用@Transactional注解,其中一条数据抛出异常了,却死活不回滚. 批量操作方法是公有的,spring也是默认支持事务的,排除代码层面问题,那么就看看数据库是否支 ...
- Spring+Junit,测试事务时,一直回滚
研究了好长时间,都不知道原因,也不能解决. 控制台又没有报异常,但是就是一直回滚.注释掉spring声明式配置的代码,就能正确的更新数据. 从网上看了,别人的文章 http://blog.csdn.n ...
随机推荐
- JavaScript ==和===
== : 值等 === :恒等(引用等) ref: http://blog.csdn.net/wang171838/article/details/8554305 JavaScript支持“=”.“ ...
- silverlight webclient实现上传、下载、删除、读取文件
1.上传 private void Button_Click_1(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = ...
- JPG各种输入框样式
输入框景背景透明:<input style="background:transparent;border:1px solid #ffffff"> 鼠标划过输入框,输入框 ...
- cookie文件在电脑的保存位置
在Windows系统上(这里以Win7为例)浏览器的Cookie IE浏览器Cookie数据位于:%APPDATA%\Microsoft\Windows\Cookies\ 目录中的xxx.txt文件 ...
- 配置Windows 2008 R2 64位 Odoo 8.0/9.0 源码开发调试环境
安装过程中,需要互联网连接下载python依赖库: 1.安装: Windows Server 2008 R2 x64标准版 2.安装: Python 2.7.10 amd64 到C:\Python27 ...
- Lua 常用的shell命令
lua作为一种小巧的脚本语言,其函数等动作可以使用shell命令进行运行和调试,以下是几个常用的shell命令.基本格式是 lua [选项参数] [脚本参数] (1)%lua 程序名.lua ...
- Ztack学习笔记(3)-系统启动分析
一 系统启动 //OSAL.cvoid osal_start_system( void ) { #if !defined ( ZBIT ) && !defined ( UBIT ) f ...
- 幻灯片slider
<script src="{$GetInstallDir}web/scripts/jquery-1.3.1.js"></script> <style& ...
- verilog逻辑复制
本文转自:http://www.cnblogs.com/linjie-swust/archive/2012/03/27/FPGA_verilog.html 在FPGA设计中经常使用到逻辑复制,逻辑复制 ...
- virtualbox usb连接问题解决
生命在于折腾... 神奇的liinux... ubuntu 14.04 LTS sudo apt-get install virtualbox -y 然后建好虚拟机之后(windows也好,linux ...