您的位置:首页 > 编程语言 > Java开发

Spring transaction事务 roll back各种回滚

2017-06-04 16:28 316 查看
Spring 事务注解的参数

属性名 
类型 
说明 
isolation 
枚举org.springframework.transaction.annotation.Isolation的值 
事务隔离级别 
noRollbackFor 
Class<? extends Throwable>[] 
一组异常类,遇到时不回滚。默认为{}
noRollbackForClassName 
Stirng[] 
一组异常类名,遇到时不回滚,默认为{}
propagation 
枚举org.springframework.transaction.annotation.Propagation的值 
事务传播行为 
readOnly 
boolean 
事务读写性 
rollbackFor 
Class<? extends Throwable>[] 
一组异常类,遇到时回滚 
rollbackForClassName 
Stirng[] 
一组异常类名,遇到时回滚 
timeout 
int 
超时时间,以秒为单位 
value 
String 
可选的限定描述符,指定使用的事务管理器 
在实际开发中有时事务会回滚有时不会回滚,具体是因为抛出的异常不同而造成的。
1、@Transactional 不指定任何回滚异常

当声明事务时,不指定任何回滚异常时,默认的是针对unchecked exception(不能够try-catch或者向上传递的异常)回滚。也就是默认对RuntimeException()异常或是其子                类进行事务回滚;

      checked异常,即Exception可try{}捕获的不会回滚。

 spring的事务管理理解为:开发者自己捕获住了,意识到了风险,就无需在进行回滚。没有捕获的是开发者意识不到的风险问题,那么就需要spring的事务来进行回滚操作。

2、如果想对所有异常进行回滚的话需要制定

@Transactional(rollbackFor = Exception.class)

       这样的话会对所有的异常进行回滚。

3、如果在代码中try{}catch住并且没有抛出来的话始终不会回滚。

eg:

测试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结果:会事务回滚----数据库中未插入新数据。
Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出一个RuntimeException 或其子类例的实例时。(Errors 也一样 - 默认地 -
标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: