当前位置:   article > 正文

@Transactional事务注解,以及在try-catch代码块中的回滚使用_添加了事物注解后怎么回滚的

添加了事物注解后怎么回滚的

1.使用的范围:

        1.用在类上,那么对该类下所有public方法都有效

        2.也可写在某个方法上(只能是public方法)

2.回滚方式:

        自动回滚:动回滚只需要在对应的方法下添加@Transactional注解,不需要对方法内容进行try-catch

        手动回滚:如果在方法中有使用try-catch,那就需要在捕获异常的地方使用:

        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();如果@Transactional跟手动回滚一起使用的话,那就需要在补获异常的地方手动抛异常,然后使用全局处理注解(需要加@responsebody注解,否则会造被视图解析器解析)来处理

5ac099143da74e4694bceab4cefade3e.png

 

 

注意:

  • Spring 中 @Transactional ,默认只对抛出的 RuntimeException 的出常,事务才会回滚。

  • 如果希望无论抛出是 RuntimeException ,还是 Exception,事务都要回滚,请使用如下配置。
@Transactional(rollbackFor={RuntimeException.class, Exception.class})

 

3.使用 Spring中 @Transactional 注解的注意事项

  • @Transactional 的事务是通过基于接口的,或者是基于类的代理才能被创建。在同一个类中一个方法调用另一个有事务注解的方法,事务是不会起作用的。
  1. @Serive
  2. public class XxxService{
  3. public void aa(){
  4. //业务...
  5. bb()
  6. //业务...
  7. }
  8. @Transactional
  9. public void bb(){
  10. //业务...
  11. }
  12. }
  13. @Controller
  14. public class XxxController(){
  15. @Autowired
  16. XxxService xxxService;
  17. @RquestMapping("/hello")
  18. public void hello(){
  19. xxxService.aa();
  20. }
  21. }
  22. XxxController.hello() 调用 XxxService 时,没有开启事务,在 aa()、 bb()发生的RuntimerException 不会事务回滚。
  23. 分析说明:
  24. 1)因为 aa() 没有 @Transactional 注解,因此 XxxController 调用 XxxService 时 ,没有开启事务;
  25. 2)aa()中调有 bb() 只是方法的调用(代码片段的调用)。类似于Thread中,开启线程是通过start()方法,而不是直接调用run()方法。

同一个类中,一个没有事务的方法A,去调用另一个有事务的方法B时,因为是直接调用,而不是调用的代理类,所以事务不起用的。

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/630177
推荐阅读
相关标签
  

闽ICP备14008679号