首页 > 其他分享 >Spring事务 - Spring事务失效的场景

Spring事务 - Spring事务失效的场景

时间:2024-10-10 18:10:32浏览次数:6  
标签:事务 管理器 Spring Transactional 失效 注解 public

Spring事务失效的场景

   概要

   用一个事务注解@Transactional来控制事务,底层实现是基于切面编程AOP实现的,而Spring中实现AOP机制采用的是动态代理,具体分为JDK动态代理和CGLIB动态代理两种模式。

1. Spring的bean的初始化过程中,发现方法有Transactional注解,就需要对相应的Bean进行代理,生成代理对象。
2. 然后在方法调用的时候,会执行切面的逻辑,而这里切面的逻辑中就包含了开启事务、提交事务或者回滚事务等逻辑。

   注意:Spring 本身不实现事务,底层还是依赖于数据库的事务。没有数据库事务的支持,Spring事务是不会生效的。

   有时候,我们明明在类或者方法上添加了@Transactional注解,却发现方法并没有按事务处理。其实,以下场景会导致事务失效。

   一、Spring框架、配置问题

   1. 没有被Spring管理

1 // @Service
2 public class OrderServiceImpl implements OrderService {
3     @Transactional
4     public void updateOrder(Order order) {
5         // update order
6     }
7 }

   Spring声明式事务的实现完全依赖于Spring的AOP代理机制,未被Spring管理的类中的方法不受Spring的AOP代理管理,因此,声明式事务失效。

   这里将@Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。

   事务不生效原因:

   @Service注解注释之后, Spring事务( @Transactional)没有生效,是因为 Spring事务是由 AOP机制实现的,也就是说从 Spring IOC容器获取 bean时, Spring会为目标类创建代理,来支持事务的。但是 @Service被注释后,这个service类都不是 spring管理的, 那怎么创建代理类来支持事务呢。

   解决方案:

   需要保证每个事务注解的每个Bean被Spring管理。

   2. 没有在Spring配置文件中配置事务管理器或启用事务管理器。

 1 @Configuration
 2 public class AppConfig {
 3     // 没有配置事务管理器
 4 }
 5 
 6 @Service
 7 public class MyService {
 8     @Transactional
 9     public void doSomething() {
10         // ...
11     }
12 }

   事务不生效原因:

   如果没有配置事务管理器或未启用事务管理,使用 @Transactional 注解时,Spring 将不会对方法进行事务处理,导致事务失效。事务管理器负责创建、提交和回滚事务,是实现事务控制的核心组件。

   解决方案:

   在 AppConfig中配置一个事务管器并且启用事务管理器

 1 @Configuration
 2 @EnableTransactionManagement
 3 public class AppConfig {
 4     @Bean
 5     public PlatformTransactionManager transactionManager() {
 6         return new DataSourceTransactionManager(dataSource());
 7     }
 8 }
 9 
10 @Service
11 public class MyService {
12     @Transactional
13     public void doSomething() {
14         // ...
15     }
16 }

   说明:如果是Spring Boot项目,它默认会自动配置事务管理器并开启事务支持。


   二、Spring AOP代理问题

1. 方法没有被public修饰

@Transactional注解只能作用于public修饰的方法上

Spring AOP 代理时,TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法会间接调用 AbstractFallbackTransactionAttributeSource的 computeTransactionAttribute 方法,获取Transactional 注解的事务配置信息。

此方法会检查目标方法的修饰符是否为 public,不是 public则不会获取@Transactional 的属性配置信息。

注意:protected、private 修饰的方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错。

解决方案:将当前方法访问级别更改为public。

4.同一个类中,方法内部调用
5.方法的访问权限不是oublic


三、底层数据库不支持

1. 数据库的存储引擎不支持事务

Spring事务的底层,还是依赖于数据库本身的事务支持。在MySQL中,MyISAM存储引擎是不支持事务的,InnoDB引擎才支持事务。因此开发阶段设计表的时候,确认你的选择的存储引擎是支持事务的。

四、Transactional配置问题
1.配置错误的@Transactional注解
2.事务超时时间设置过短
3.使用了错误的事务传播机制
4.rollbackFor属性配置错误

五、开发使用不当

1. 事务注解被覆盖导致事务失效
2.嵌套事务的坑
3.事务多线程调用
4.异常被捕获并处理了,没有重新抛出
5.手动抛了别的异常


参考链接:

https://juejin.cn/post/7179080622504149029
https://heapdump.cn/article/5542790

标签:事务,管理器,Spring,Transactional,失效,注解,public
From: https://www.cnblogs.com/hld123/p/18456892

相关文章

  • SpringBoot整合MD5加密完成注册和登录
    目录md5是什么?MD5的主要特点包括:MD5的应用场景市面上比较流行的加密方式引入相关依赖在src/main/resources/application.yml中添加配置加密工具类创建User实体类创建UserRepository接口创建UserService类创建UserController类测试APImd5是什么? ......
  • [Java/Spring] 深入理解 : Spring BeanFactory / ApplicationContext、Environment、P
    PropertySource:解析环境资源及配置的底层组件org.springframework.core.env.PropertyResolverEnvironment:管理环境的配置与资源org.springframework.core.env.Environment其继承接口PropertyResolver属性解析器,用来解析不同属性源PropertySource里的key......
  • Spring声明事务
    spring事务有2种用法:编程式事务和声明式事务。编程式事务上一篇文章中已经介绍了,不熟悉的建议先看一下编程式事务的用法。这篇主要介绍声明式事务的用法,我们在工作中基本上用的都是声明式事务,所以这篇文章是比较重要的,建议各位打起精神,正式开始。什么是声明式事务?所谓声明......
  • Spring是什么?我们为什么要学习它?
    环境jdk1.8ideamaven-3.6.1spring-5.2.3.RELEASE整个spring系列使用官方最新版本5.2.3.RELEASE,会有大量案例,都是通过maven来管理的,所以maven是必备技能,对这块不熟悉的可以去看一下:Maven系列为什么需要学习spring?最大程度的简化了开发spring是一个非常优秀的java框架,其目......
  • antd中的多选框defaultValue失效问题
    antd中的Checkbox.Group属性中的 defaultValue为数组当改变某个状态需要改变这个数组发现失效解决办法:            Checkbox.Group添加key值为defaultValue指定的数组 当key值发生变化组件会重新渲染,从而使更新后的defaultValue属性生效。原因:defaultVa......
  • Spring事务管理与AOP代理的原理,默认的单例对象和代理对象销毁的时机
    Spring的事务管理是使用AOP(面向切面编程)代理的原理来实现的。Spring事务管理与AOP代理原理AOP代理的作用:在Spring中,AOP代理用于在目标对象的方法执行前后注入自定义的逻辑,这些逻辑通常与业务逻辑无关,但需要在业务逻辑执行时同步执行,如事务管理、日志记录、性能检测等。通过......
  • Java中常见的异常分类,结合Spring的事务巩固复习
    Java异常的继承关系是通过类继承的方式构建的一个层次结构。以下是对Java异常继承关系的详细图解说明:异常类的顶层Throwable:所有异常和错误的超类。Throwable的子类Error:通常是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将......
  • Spring Security(常见过滤器介绍)
    SpringSecurity是一个基于Spring框架的安全性解决方案,为Java应用程序提供了一套全面的安全解决方案。一、概述SpringSecurity是Spring采用AOP(面向切面编程)思想,基于servlet过滤器实现的安全框架。它致力于保护基于Spring的应用程序,并成为了这类应用的事实上的安全标准。S......
  • Spring事务的1道面试题
    每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。原理Spring事务的原理是:通过AOP切面的方式实现的,也就是通过代理模式去实现事务增强。具体过程是:对包含@Transactional注解的方法进行拦截,然后重写,重新在方法里加入异......
  • Springboot二手车估值与销售网络平台l0471(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表客户,汽车分类,车辆信息,车辆估价,商家开题报告内容一、研究背景随着汽车消费市场的不断扩大和二手车交易的增多,设计和实现一个二手车估值与销售网络平台具有重......