SpringBoot事务注解@Transactional事物回滚、⼿动回滚事物处理springboot 下提交事务异常,数据库没有回滚的问题。
springframework事务spring的⽂档中说道,spring声明式事务管理默认对⾮检查型异常和运⾏时异常进⾏事务回滚,⽽对检查型异常则不进⾏回滚操作。
什么是检查型异常什么⼜是⾮检查型异常?
最简单的判断点有两个:
1.继承⾃runtimeexception或error的是⾮检查型异常,⽽继承⾃exception的则是检查型异常(当然,runtimeexception本⾝也是exception的⼦类)。
2.对⾮检查型类异常可以不⽤捕获,⽽检查型异常则必须⽤try语句块进⾏处理或者把异常交给上级⽅法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务⽅才起效。
结论:
在spring的事务管理环境下,使⽤unckecked exception可以极⼤地简化异常的处理,只需要在事务层声明可能抛出的异常(这⾥的异常可以是⾃定义的unckecked exception体系),在所有的中间层都只是需要简单throws即可,不需要捕捉和处理,直接到最⾼层,⽐如UI层再进⾏异常的捕捉和处理。
默认规则:
1 让checked例外也回滚: @Transactional(rollbackFor=Exception.class),⼀般只需添加这个即可
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)⽅法:@Transactional(propagation=Propagation.NOT_SUPPORTED),或者不添加
注意:如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。因为⼀旦你try{}catch{}了。系统会认为你已经⼿动处理了异常,就不会进⾏回滚操作。
⽰例:
⽰例
spring 事务控制设置⼿动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
View Code
如上:
当我们需要在事务控制的service层类中使⽤try catch 去捕获异常后,就会使事务控制失效,因为该类的异常并没有抛出,就不是触发事务管理机制。怎样才能即使⽤try catch去捕获异常,⽽⼜让出现异常后spring回滚呢,这⾥就要⽤到
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
完美解决问题。并且能够使该⽅法执⾏完。
这个需要注意两点:
1. ⽅法上要加上 @Transactional(rollbackFor = Exception.class) 再配合
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 才可以,
否则会报错 NoTransactionException: No transaction aspect-managed TransactionStatus in scope
at
View Code
2. Spring Transactional⼀直是RD的事务神器,但是如果⽤不好,反会伤了⾃⼰。下⾯总结@Transactional经常遇到的⼏个场景:
View Code
Transactional是否⽣效, 仅取决于是否加载于接⼝⽅法, 并且是否通过接⼝⽅法调⽤(⽽不是本类调⽤)。
View Code
View Code
3.在web项⽬中,很多时候要⽤到@Transactional 注解⽅法或者类进⾏事务处理,⾃动事务提交有时候就会有问题,这个时候就要⽤到⼿动进⾏事务提交,在try catch 异常抛出⾥⾯⼿动回滚事务处理TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
使⽤Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 设置回滚点,
使⽤TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。
转⾃:
blog.csdn/zhuchunyan_aijia/article/details/80191534
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论