作者 : kyle   时间 : 2018-10-01   浏览 : ...

默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。

service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚。

触发事物的两种方式
1、例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚(在service上层要继续捕获这个异常并处理)

2、在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动进行事物回滚(这样上层就无需去处理异常)

spring使用AOP来处理事务,处理事物的伪代码:
spring开启事务

try {

    执行实际方法

    spring 提交事务

}catch(Exception e){

    spring 回滚事务
 
}finally{

}

在Spring中发生的SQL异常可以触发事务回滚的原因
在对Spring的事务回滚捕获的异常类型进行测试,发现当出现SQL异常时可以触发事务回滚,但是通过查看文档发现,Java.lang.SQLExcepetion是Java.lang.Excepetion的子类,在没有对事务设置rollbackfor=Exception.class时是不会默认对捕获的Excepetion类型异常触发事务回滚操作,而实际情况却与此相反,触发了事务回滚。经过查阅相关资料,文章https://blog.csdn.net/qq_32331073/article/details/76525372对该问题进行了详细的解答。文章中说到在项目开发中引入了spring框架后,SQLExcepetion被org.springframework重写,经过重写后涉及到dao的异常都是java.lang.RuntimeException的子类。因此事务回滚才会发生。

原创文章如转载,请注明本文链接: http://www.seaxiang.com/blog/spring_deal_transaction
seaxiang  All Rights Reserved   粤ICP备15083047号-1