Spring高手之路-Spring事务失效的场景详解

这篇具有很好参考价值的文章主要介绍了Spring高手之路-Spring事务失效的场景详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

@Transactional 应用在非 public 修饰的方法上

同一个类中方法调用,导致@Transactional失效

final、static方法

@Transactional的用法不对

@Transactional 注解属性 propagation 设置不当

@Transactional注解属性 rollbackFor 设置错误

用错注解

异常被捕获

数据库引擎不支持事务


前言

Spring中比较容易失效的就是通过@Transactional 定义的声明式事务,他在以下几个场景中会导致事务失效,首先,就是Spring的@Transactional是基于Spring的AOP机制实现的,而AOP机制又是基于动态代理实现的。那么如果代理失效了,事务也就会失效。

Spring高手之路-Spring的AOP失效场景详解-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135614540?spm=1001.2014.3001.5502

1.@Transactional 应用在非 public 修饰的方法上

 @Transactional
    private void privateMethod() {
        // 在这里执行事务操作
    }

2.同一个类中方法调用,导致@Transactional失效

public class MyService {

    @Transactional
    public void methodA() {
        // 在这里执行一些业务逻辑
      
    }

    public void methodB() {
        // 在这里执行一些业务逻辑
        methodA()
    }
}

3.final、static方法

由于AOP是通过创建代理对象来实现的,而无法对final方法进行子类化和覆盖,所以无法拦截这些方法。
还有就是调用static方法,因为这类方法是属于这个类的,并不是对象的,所以无法被AOP

4.@Transactional的用法不对

@Transactional 注解属性 propagation 设置不当

详情可以看:

Spring高手之路-Spring事务的传播机制(行为、特性)-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135277125?spm=1001.2014.3001.5502

 @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void updateProduct(Product product) {
        try {
            // 更新产品信息
            productRepository.update(product);
            
            // 抛出异常
            throw new RuntimeException("Something went wrong");
        } catch (Exception e) {
            // 处理异常
            System.out.println("Caught exception: " + e.getMessage());
        }
    }

事务传播行为被设置为NOT_SUPPORTED,以非事务方式执行操作。

5.@Transactional注解属性 rollbackFor 设置错误

@Service
public class ProductService {
    
    @Autowired
    private ProductRepository productRepository;
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateProduct(Product product) {
        try {
            // 更新产品信息
            productRepository.update(product);
            
            // 抛出异常
            throw new Exception("Something went wrong");
        } catch (Exception e) {
            // 处理异常
            System.out.println("Caught exception: " + e.getMessage());
        }
    }
}

updateProduct方法中,虽然使用了@Transactional注解来管理事务,但是没有设置rollbackFor属性,因此默认情况下只会回滚RuntimeException及其子类异常,而不回滚其他类型的异常(如Exception)。当在try块中抛出Exception异常时,Spring并不会认为这是需要回滚事务的异常,所以事务不会被回滚。

6.用错注解

有的时候,你排查了很久,发现都没问题,但是还是不生效,然后找别人来帮你看,他上来就看了一下你用的@Transactional,发现并不是Spring中的,而是其他什么地方的,比如javax.transaction.Transactional ,这样也会导致事务失效

7.异常被捕获

异常被catch捕获但未抛出导致@Transactional失效

    @Transactional
    public void updateProduct(Product product) {
        try {
            // 更新产品信息
            productRepository.update(product);
            
        } catch (Exception e) {
            // 处理异常
            System.out.println("Caught exception: " + e.getMessage());
        }
    }

8.数据库引擎不支持事务

既然底层的数据库引擎不支持,那肯定就没法生效文章来源地址https://www.toymoban.com/news/detail-801817.html

到了这里,关于Spring高手之路-Spring事务失效的场景详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring中事务失效的8中场景 对于一个事务开子线程

    1. 数据库引擎不支持事务 这里以 MySQL为例,MyISAM引擎是不支持事务操作的,一般要支持事务都会使用InnoDB引擎,根据MySQL 的官方文档说明,从MySQL 5.5.5 开始的默认存储引擎是 InnoDB,之前默认的都是 MyISAM,所以这一点要值得注意,如果底层引擎不支持事务,那么再怎么设置也

    2024年02月16日
    浏览(28)
  • Spring事务失效场景之类内部方法调用及解决方案

    在日常开发中,经常有需要使用事务来保证数据一致性的情况。简单点的话直接在方法上面加@Transactional注解就可以了。 但这样存在一个问题,在整个业务方法层面加注解会把很多并不需要归入事务的操作也归入到了事务里面,这样会可能会出现大事务的情况,影响系统性能

    2024年01月17日
    浏览(38)
  • Spring高手之路8——Spring Bean模块装配的艺术:@Import详解

      在 Spring 中,手动装配通常是指通过 XML 配置文件明确指定 Bean 及其依赖,或者在代码中直接使用 new 创建对象并设定依赖关系。   然而,随着 Spring 2.0 引入注解,以及 Spring 3.0 全面支持注解驱动开发,这个过程变得更加自动化。例如,通过使用 @Component + @Compo

    2024年02月13日
    浏览(24)
  • 面试官让列举Spring的事务会失效的场景,我说了8个

    本文分享自华为云社区《哪些场景下Spring的事务会失效?》,作者:冰 河 。 在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。 今天,我们就一起梳理下有哪

    2024年02月11日
    浏览(28)
  • Spring高手之路-Spring在业务中常见的使用方式

    目录 通过IOC实现策略模式 通过AOP实现拦截增强 1.参数检验 2.缓存逻辑 3.日志记录 通过Event异步解耦 通过Spring管理事务 1.声明式事务 2.编程式事务 3.需要注意的问题 不能在事务中处理分布式缓存 不能在事务中执行 RPC 操作 不过度使用声明式事务 很多时候,我们需要对不同的

    2024年01月19日
    浏览(32)
  • Spring高手之路9——掌握Spring条件装配的秘密武器

      在 Spring 框架中,条件装配( Conditional Configuration )是一个非常重要的特性,它允许开发者根据满足的条件,动态地进行 Bean 的注册或是创建。这样就可以根据不同的环境或配置,创建不同的 Bean 实例,这一特性对于创建可配置和模块化的应用是非常有用的。 Spring 提供了一

    2024年02月16日
    浏览(31)
  • Spring高手之路10——解锁Spring组件扫描的新视角

      首先,我们将探讨一些 Spring 框架中 IOC ( Inversion of Control )的高级特性,特别是组件扫描的相关知识。组件扫描是 Spring 框架中一个重要的特性,它可以自动检测并实例化带有特定注解(如 @Component , @Service , @Controller 等)的类,并将它们注册为 Spring 上下文中的 bean 。这

    2024年02月16日
    浏览(38)
  • Spring高手之路-SpringBean的生命周期

    目录 SpringBean的生命周期 整体介绍 详细介绍 1.实例化Bean 2.设置属性值 3.检查Aware 4.调用BeanPostProcessor的前置处理方法 5.调用InitializingBean的afterPropertiesSet方法 6.调用自定义init-method方法 7.调用BeanPostProcessor的后置处理方法 8.注册Destruction回调 9.Bean准备就绪 10.调用DisposableBean的d

    2024年02月03日
    浏览(28)
  • Spring高手之路3——揭秘Spring依赖注入和SpEL表达式

    本篇会给大家举出各种 Spring 属性依赖注入的例子,方便大家理解。 我们在前面的文章中已经使用过 XML 进行 setter 方法的属性注入了,下面让我们再来回顾一下: 我们在前面的文章中也学习过如何在 bean 创建时通过编程方式设置属性: 使用XML进行setter方法注入 首先,我们需

    2024年02月08日
    浏览(32)
  • Spring高手之路11——BeanDefinition解密:构建和管理Spring Beans的基石

       BeanDefinition 是 Spring 中一个非常重要的概念,它包含了 Spring 容器用于创建、配置 Bean 所需的所有信息。理解 BeanDefinition 可以帮助我们深入掌握 Spring 的内部工作机制。 首先,让我们来对 BeanDefinition 有一个整体的认识。   对于理解 Spring 框架的概念和组件, Spring 的官方

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包