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 框架项目案例:www.fhadmin.org)

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

//不会自动回滚
try{throw new RuntimeException();
}catch(RuntimeException e){e.printStackTrace();
}finally{}
//会自动回滚
try{throw new RuntimeException();
}catch(RuntimeException e){e.printStackTrace();throw new RuntimeException();
}finally{}



Springboot @Transactional 事务不回滚

一、异常捕获的原因

  1. 这里Exception异常,他又分为运行时异常RuntimeException和非运行时异常
  2. 可查的异常(checked exceptions):Exception下除了RuntimeException外的异常
  3. 不可查的异常(unchecked exceptions):RuntimeException及其子类和错误(Error)
  4. 异常checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
  5. 异常unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
  6. 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}

二、数据库引擎不支持回滚(使用MYSQL就很可能是这个原因)

  1. Mysql数据库有两种引擎,注意要使用支持事务的引擎,比如innodb,如果是MyISAM,事务是不起作用的。

  2. 使用springboot的jpa自动创建库表的时候,默认使用MyISAM引擎,可以检查库表查看引擎。

  3. 修改配置:

    spring:  jpa:hibernate:ddl-auto: updatenaming:physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #按字段名字建表show-sql: truedatabase: mysqldatabase-platform: org.hibernate.dialect.MySQL5InnoDBDialect  #使用innodb引擎建表
    

三、发生了自调用情况

spring的数据库事务调用的实现原理是AOP,而AOP的原理是动态代理,在自调用的过程中,是类自身的调用,而不是代理对象去调用,那么不会产生AOP,没有AOP,意味着@Transactional不会被切面捕获,这样spring就不能把你的代码植入到约定的流程中,于是就产生了事务回滚失败。

解决方案:

1、将涉及到事务的处理都放入一个方法中,由其他类调用。

2、如果非要在本类中调用,那么需要在本类中生成本类的bean对象,由这个bean对象来调用,实现方式也有多种:

  • 自注入
  • 通过SpringContextHolder获取bean,即注入ApplicationContext,从ApplicationContext获取bean
  • 通过AopContext获取当前类的代理对象,注意此种方式需要开启expose-proxy=“true”,可通过注解开启@EnableAspectJAutoProxy(exposeProxy =true)

最后一种方式的伪代码:

@Service
public class OrderService {public void insert() {OrderService proxy = (OrderService) AopContext.currentProxy();proxy.insertOrder();}@Transactionalpublic void insertOrder() {//SQL操作}
}

[

因为AopContext默认是不暴露当前代理类的,所以要@EnableAspectJAutoProxy(exposeProxy =true)或者<aop:aspectj-autoproxy expose-proxy=“true”/>:

四、补充:

在Spring 的AOP实现有两种代理方式:

  • Java动态代理 :通过反射生成一个实现了代理方法的匿名类来完成代理
  • cglib代理 :通过Asm修改字节码文件,生成一个子类来完成代理

Spring在项目中会根据被代理对象是否实现了接口来自动切换上述两种代理方式

所以private方法也不能实现事务

SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚相关推荐

  1. springboot 事务手动回滚_来,讲讲Spring事务有哪些坑?

    来自公众号:孤独烟 引言 今天,我们接上文<面试官:谈谈你对mysql事务的认识>的内容,来讲spring中和事务有关的考题! 因为事务这块,面试的出现几率很高.而大家工作中CRUD的比较 ...

  2. Spring事务总结(一) 内部调用事务失效、异常回滚

    Spring事务总结(一) 内部调用事务失效.异常回滚 参考文章: (1)Spring事务总结(一) 内部调用事务失效.异常回滚 (2)https://www.cnblogs.com/gss128/p ...

  3. Try-Catch 包裹的代码异常后,竟然导致了产线事务回滚!| 原力计划

    一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着< ...

  4. Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?

    写这篇文章的初衷呢就是最近遇到了一个Spring事务的大坑.与其说是坑,还不如说是自己事务这块儿太薄弱导致的(自嘲下). 项目环境 Spring Boot 下面开始问题描述,发生的过程有点长,想直接看 ...

  5. Java的@Transactional事务回滚

    @Transactional 基本原理概述 在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@ ...

  6. 事务回滚什么意思 try_分布式事务 TCC-Transaction 源码分析——事务恢复

    1. 概述 本文分享 TCC 恢复.主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover RecoverConfig,事务恢复配置接口 ...

  7. @Transactional事务回滚使用

    使用:作用于类时,对该类下所有public方法都有效,也可写在某个方法上,当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息 回滚方式: ...

  8. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  9. 数据事务及ACID特性、事务回滚

    如有问题,请予以指出,多多指教! 什么是数据库事务? 数据库事务是数据库管理系统在执行过程中的一个逻辑序列,它是由一个有限的数据库操作序列构成,说白了就是一个单位. start Transaction ...

最新文章

  1. Python10分钟入门
  2. k8s包管理器helm_eShopOnContainers 知多少[10]:部署到 K8S | AKS
  3. mysql8连接数据库显示cache_MySQL数据库之mysql 8.0 java连接报错:Unknown system variable 'query_cache_size'...
  4. linux缓存代码,Linux使用的缓存
  5. android http 三次 握手,面试解析:3次握手与4次挥手
  6. 基本的Windows相关的DOS命令
  7. 监控磁盘并发mail通知
  8. mysql如何导出word_SQL导出为Word
  9. 接口上加@feignclient还有实现类_类接口的实现及应用
  10. 如何保障MySQL主从复制关系的稳定性?关键词(新特性、crash-safe)
  11. 大数据项目实战数仓4——常用脚本
  12. 盘点OLCF的超级计算机
  13. 洛谷P1074 靶形数独 [搜索]
  14. 如何用几何画板破解版制作正方体展开动画
  15. excel2016 android,新编Excel 2016应用大全(实战精华版)
  16. 计算机信息专业致谢词,计算机专业毕业论文致谢词.doc
  17. “打工女皇帝”吴士宏-永远先走一步
  18. 网易云web安全工程师第一天
  19. Win11系统默认用户名怎么进行修改教学
  20. wps 每页显示50行

热门文章

  1. web浏览器_Web上的分享(Share)API
  2. [转载] python通过adb获取android手机耗电量
  3. Java ObjectInputStream enableResolveObject()方法与示例
  4. 360修复导致服务器,桌面安装360软件修复漏洞补丁导致桌面TC端无法登陆,FC端VNC登陆一键修复显示HDC不可达...
  5. 家谱整站源码php_mysql家谱表查询某人所有后代
  6. pythonmysqldb_python中MySQLdb的使用
  7. ruby中!!_Ruby反向! 功能
  8. c# 用空格分割字符串_C#| 左用空格填充字符串
  9. 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration
  10. Python 代码优化常见技巧