spring的事物处理方式
默认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中发生的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的子类。因此事务回滚才会发生。
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的子类。因此事务回滚才会发生。
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦