首页 > 其他分享 >SpringAOP之@Transactional处理事务

SpringAOP之@Transactional处理事务

时间:2023-12-20 22:56:14浏览次数:35  
标签:... Spring Transactional 失效 SpringAOP 注解 处理事务 public

跟着孙哥学Spring,b站:https://www.bilibili.com/video/BV185411477k/?spm_id_from=333.337.search-card.all.click


引言

在现代的Java应用开发中,Spring框架提供了丰富的功能来简化复杂性。其中,事务管理是一个至关重要的部分。@Transactional注解为我们提供了一种便捷的方式来声明事务边界。然而,事务管理并不总是如我们所愿。在某些情况下,我们可能会遇到@Transactional注解失效的问题。本文将深入探讨这些情况,并提供解决策略。

1. @Transactional的工作原理

首先,让我们回顾一下@Transactional的基本工作原理。当我们在方法上使用这个注解时,Spring AOP会为该方法创建一个代理对象,负责管理事务的开始、提交、回滚等操作。

2. @Transactional失效的深入探讨

2.1. 方法调用在同一个类中

一个常见但容易被忽视的问题是,在同一个类中调用另一个被@Transactional注解的方法。这样的调用实际上是一个普通的Java方法调用,不会通过Spring的事务代理。

public class TransactionalService {
    
    @Transactional
    public void methodA() {
        // ...
        methodB();  // 这里的事务可能会失效
        // ...
    }

    private void methodB() {
        // ...
    }
}

这里的核心问题是,Spring的AOP代理默认只对从Spring容器获取的bean实例的方法调用进行代理。因此,同一个类内部的方法调用不会触发代理,从而使得事务注解失效。

2.2. 静态方法

另一个常见的陷阱是尝试在静态方法上使用@Transactional注解。静态方法是与类本身关联的,而不是与特定的对象实例关联。由于Spring的事务代理是基于对象实例的,因此在静态方法上使用@Transactional会导致代理失效。

@Transactional
public static void staticMethod() {
    // ...
}

2.3. 类级别的注解

虽然@Transactional注解在方法级别上是非常有用的,但应该避免在类级别上过度使用。因为这可能会导致整个类的所有方法都被统一管理,而这通常并不是我们想要的行为。

@Transactional
public class TransactionalClass {
    // ...
}

3. 解决策略

了解了上述问题后,我们可以采取以下策略来避免@Transactional注解失效:

  • 确保@Transactional注解仅应用于非静态的public或protected方法。
  • 避免在同一个类中直接调用其他被@Transactional注解的方法。
  • 注意事务注解的应用级别,确保它们仅应用于方法级别。

结论

Spring框架为我们提供了强大的工具来简化事务管理。然而,了解@Transactional注解可能失效的各种情况是至关重要的。通过深入研究这些问题,并采取相应的解决策略,我们可以更加稳定和高效地使用Spring的事务管理功能。

标签:...,Spring,Transactional,失效,SpringAOP,注解,处理事务,public
From: https://www.cnblogs.com/zzusjw/p/17917817.html

相关文章

  • 如何让@Transactional注解方法被无注解的方法调用时使事务生效
    Java-如何让@Transactional注解方法被无注解的方法调用时使事务生效问题在springboot项目中,同一个类中,无@Transaction注解的方法调用另一个有@Transaction注解的方法,该如何让事务生效?‍解法importorg.springframework.beans.factory.annotation.Autowired;importorg.spr......
  • 如何让@Transactional注解方法被无注解的方法调用时使事务生效
    Java-如何让@Transactional注解方法被无注解的方法调用时使事务生效问题在springboot项目中,同一个类中,无@Transaction注解的方法调用另一个有@Transaction注解的方法,该如何让事务生效?‍解法importorg.springframework.beans.factory.annotation.Autowired;importorg.spr......
  • SpringBoot中@Transactional失效场景
    一、背景:1、需求  定时器需要定时到“消息通知表”中获取“消息反馈表”中不存在的数据,遍历这些数据,并对每一条数据发起流程,不管发起成功与否都需要往消息反馈表中插入一条该数据的发起结果,若发起成功还需要往“核查案件表”中插入一条该案件的主表数据2、问题:  发现在发......
  • SpringAOP的组成包含哪些
    SpringAOP的组成包含哪些SpringAOP(面向切面编程)的主要组成部分包括以下几个关键概念:切面(Aspect):切面是横切关注点的模块化单元。它封装了横切关注点的具体实现,包括通知和切点。通常,切面是一个类,其中包含了定义在何处以及如何执行横切关注点的代码。通知(Advice):通知是切面......
  • @Transactional事务注解及请求接口的定义先后执行顺序设计
    @Transactional事务注解及请求接口的定义先后执行顺序设计1.事务内查询,可能存在事务没有提交,导致查询数据查不出来。2.或者可能跟请求参数作为查询条件,在某个条件下,请求参数发生变化,也会导致查询不出来。可以将在一个事务内的操作(定义为一个组,Group_ID),根据组号来查询。根据接口......
  • Spring5学习随笔-事务属性详解(@Transactional)
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第三章、Spring的事务处理1.什么是事务?事务是保证业务操作完整性的一种数据库机制事务的4特点:ACIDA原子性C一致性I隔离性D持久性2.如何......
  • 面试官:@Transactional(readOnly=true) 有什么用?还有谁不会?!
    原文翻译自:https://medium.com今天,我想谈谈Spring提供的@Transactional(readOnly=true)。之所以聊这个是因为我公司项目的代码里有很多@Transactional(readOnly=true),用过的同学都说@Transactional(readOnly=true)提高了性能。先思考以下几点:@Transactional(readOnly......
  • Spring Boot - @Transactional 标注的方法如何使用 synchronized?
    这篇文章中有说到@Transactional标注的方法也有锁的情况下会出现一些问题,具体请看SpringBoot锁。而且Idea也会标一个黄色波浪线提示你。我是这样做的,仅供参考。file:[DiscussionService.java]@ServicepublicclassDiscussionServiceimplementsIDiscussionService{......
  • @Transactional:声明式事务管理,保证数据一致性
    一、介绍通过使用@Transactional注解,我们可以更加方便地管理事务,保障数据的一致性和可靠性。在实际项目中,合理使用@Transactional注解可以提高「开发效率」和代码「可维护性」。二、用法@Transactional(rollbackFor=Exception.class)publicResponseDTO<String>update(No......
  • Spring源码解析——@Transactional注解的声明式事物介绍
    正文面的几个章节已经分析了spring基于@AspectJ的源码,那么接下来我们分析一下Aop的另一个重要功能,事物管理。最全面的Java面试网站事务的介绍1.数据库事物特性原子性多个数据库操作是不可分割的,只有所有的操作都执行成功,事物才能被提交;只要有一个操作执行失败,那么所有的操作......