Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185495
  • 博文数量: 156
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1640
  • 用 户 组: 普通用户
  • 注册时间: 2019-06-17 10:57
文章分类

全部博文(156)

文章存档

2021年(155)

2019年(1)

我的朋友

分类: Java

2021-07-03 14:47:07

Springboot中事务的使用:

1、启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的)。

2、在使用事务的public(只有public支持事务)方法(或者类-相当于该类的所有public方法都使用)加上@Transactional注解。

在实际使用中一般是在service中使用@Transactional,那么对于controller->service流程中:

如果controller未开启事务,service中开始了事务,service成功执行,controller在之后的运行中出现异常(错误),不会自动回滚。

也就是说,只有在开启事务的方法中出现异常(默认只有非检测性异常才生效-RuntimeException )(错误-Error)才会自动回滚。

 如果想要对抛出的任何异常都进行自动回滚(而不是只针对RuntimeException),只需要在使用@Transactional(rollbackFor = Exception.class)即可。

开启事务的方法中事务回滚的情况:

①未发现的异常,程序运行过程中自动抛出RuntimeException或者其子类,程序终止,自动回滚。

②使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚。

③注意:如果在try-catch语句中对可能出现的异常(RuntimeException)进行了处理,没有再手动throw异常,spring认为该方法成功执行,不会进行回滚,此时需要调用②中方法进行手动回滚 (java 框架项目案例 fhadmin.cn)

另外,如果try-catch语句在finally中进行了return操作,那么catch中手动抛出的异常也会被覆盖,同样不会自动回滚。

点击(此处)折叠或打开

  1. //不会自动回滚
  2. try{
  3.     throw new RuntimeException();
  4. }catch(RuntimeException e){
  5.     e.printStackTrace();
  6. }finally{
  7. }
  8. //会自动回滚
  9. try{
  10.     throw new RuntimeException();
  11. }catch(RuntimeException e){
  12.     e.printStackTrace();
  13.     throw new RuntimeException();
  14. }finally{
  15. }
阅读(6115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~