深入理解 Spring:事务管理与事件机制全解析

文章目录

  • 前言
  • 一、Spring 事务管理(Transaction Management)
    • 1. 使用 @Transactional 管理事务
    • 2. 核心属性说明
    • 3. 事务传播行为详解(Propagation)
    • 4. 异常回滚策略分析
    • 5. 底层原理剖析(源码级)
  • 二、Spring 事件机制(ApplicationEvent)
    • 1.定义自定义事件类
    • 2. 发布事件
    • 3. 监听事件(两种方式)
    • 4. 异步监听事件
    • 5. 控制事件监听器优先级
    • 避坑提醒:
  • 总结


在这里插入图片描述

前言

在开发复杂的企业级系统时,Spring 框架的事务管理和事件机制是两个不可或缺的核心模块。本文将从实际开发出发,全面讲解 Spring 的事务处理原理、事件发布-监听机制,并深入剖析常被忽视但极其重要的细节:事务传播行为、异常回滚策略与事件优先级控制,帮助你在关键业务场景中少踩坑,提升系统健壮性与可维护性。


一、Spring 事务管理(Transaction Management)

Spring 提供了声明式和编程式两种事务管理方式,声明式事务结合注解与 AOP,更加简洁、优雅。

1. 使用 @Transactional 管理事务

@Service
public class OrderService {@Transactionalpublic void createOrder() {// 插入订单// 扣减库存// 插入操作日志}
}

2. 核心属性说明

属性含义
propagation事务传播行为(默认:REQUIRED)
isolation事务隔离级别(如 READ_COMMITTED)
rollbackFor指定哪些异常类型触发回滚
readOnly是否只读,适用于查询优化
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,rollbackFor = Exception.class
)

3. 事务传播行为详解(Propagation)

Spring 定义了 7 种事务传播行为,用于处理不同事务上下文嵌套关系:

类型含义
REQUIRED默认,存在事务则加入,否则新建
REQUIRES_NEW总是新建事务,挂起当前事务
NESTED嵌套事务,支持回滚到 Savepoint
SUPPORTS有事务则加入,无则非事务执行
NOT_SUPPORTED永远非事务,挂起当前事务
MANDATORY必须存在事务,否则抛异常
NEVER禁止事务,有事务就抛异常
@Transactional
public void methodA() {methodB(); // 默认 REQUIRED
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {// 新事务
}

注意:REQUIRES_NEW 将暂停 methodA 的事务,独立执行和提交/回滚 methodB。

4. 异常回滚策略分析

默认行为:

  • 运行时异常(RuntimeException):自动回滚
  • 受检异常(Exception):默认不回滚,需手动指定

显式配置:

@Transactional(rollbackFor = Exception.class)
public void method() throws Exception {throw new Exception("不会默认回滚,需配置 rollbackFor");
}

5. 底层原理剖析(源码级)

Spring 声明式事务的核心实现类为:

  • TransactionInterceptor:事务切面拦截器
  • PlatformTransactionManager:统一事务管理接口
  • DataSourceTransactionManager:JDBC 实现
  • TransactionAspectSupport:控制事务的实际逻辑

流程:

  • 代理对象拦截方法调用;
  • TransactionInterceptor.invoke() 判断事务属性;
  • 调用 AbstractPlatformTransactionManager#getTransaction() 创建事务;
  • 执行目标方法;
  • 根据是否异常决定提交或回滚。

二、Spring 事件机制(ApplicationEvent)

Spring 内置发布-订阅模型,可用于解耦系统模块,处理异步或扩展性强的逻辑,如日志、通知、审计等。

1.定义自定义事件类

public class UserRegisteredEvent extends ApplicationEvent {private final String username;public UserRegisteredEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() {return username;}
}

2. 发布事件

@Component
public class UserService {@Autowiredprivate ApplicationEventPublisher publisher;public void register(String username) {// 注册业务逻辑publisher.publishEvent(new UserRegisteredEvent(this, username));}
}

3. 监听事件(两种方式)

方式一:实现接口 ApplicationListener

@Component
public class EmailNotifier implements ApplicationListener<UserRegisteredEvent> {public void onApplicationEvent(UserRegisteredEvent event) {System.out.println("发送欢迎邮件给:" + event.getUsername());}
}

方式二:注解方式 @EventListener

@Component
public class SmsNotifier {@EventListenerpublic void handle(UserRegisteredEvent event) {System.out.println("发送短信通知:" + event.getUsername());}
}

4. 异步监听事件

@EnableAsync
@Configuration
public class AsyncConfig {// 配置线程池等
}

监听器加 @Async:

@Async
@EventListener
public void asyncHandle(UserRegisteredEvent event) {// 异步通知
}

5. 控制事件监听器优先级

多个监听器响应同一事件时,可通过以下方式控制执行顺序:

使用 @Order

@Order(1)
@EventListener
public void firstHandler(MyEvent event) {// 优先执行
}

实现 SmartApplicationListener

@Component
public class HighPriorityListener implements SmartApplicationListener {public int getOrder() {return 0;}public void onApplicationEvent(ApplicationEvent event) {// 最优先执行}public boolean supportsEventType(Class<?> eventType) {return eventType == MyEvent.class;}
}

底层通过 AnnotationAwareOrderComparator 排序后执行。

避坑提醒:

  • 内部方法调用不会触发 @Transactional(绕过代理)
  • @Transactional 默认仅回滚运行时异常
  • 事件监听器顺序未设置可能导致逻辑混乱
  • 事务+事件混用时注意异步监听器提前执行(事务未提交)

总结

本文深入解析Spring框架的事务管理和事件机制两大核心功能。在事务管理方面,详细介绍了@Transactional注解的使用、7种事务传播行为、异常回滚策略及底层实现原理;在事件机制方面,讲解了自定义事件定义、发布订阅模式实现、异步监听及优先级控制。文章特别强调了实际开发中的常见陷阱,如内部方法调用失效、异常回滚范围、事件监听顺序等问题,帮助开发者避免潜在错误。通过掌握这些关键知识点,能够有效提升企业级应用的可靠性、可维护性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89733.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWD练习的平台搭建

ubuntu虚拟机搭建 前提资源准备 进行AWD我们需要在一个独立的虚拟机 现在就来搭建一个ubuntu的 这里我们使用的VMware是17的 然后下载镜像的地址&#xff1a;Ubuntu最全的国内镜像下载地址 - 哔哩哔哩 我下载的是中科大的 这里需要准备的前提资源就有了。 创建Ubuntu虚…

C++ 详谈继承体系下的构造函数和析构函数

前言 前面呢, 我们说了C中实现多态的原理, 其中也说了, 虚函数表和虚函数指针的创建时机, C 详谈多态实现原理-CSDN博客 , 这一节呢, 我们会说说在C中继承体系下的另一个知识点, 那就是: 继承体系下的构造函数和析构函数~~, 主要围绕两个问题: 执行顺序? 虚析构函数的作用? …

PostgreSQL 字段类型速查与 Java 枚举映射

1. 查询 SQLSELECTc.table_schema,c.table_name,c.column_name,c.data_type,c.udt_name,CASE-- 数值WHEN c.udt_name IN (int2,int4,int8,float4,float8,numeric,money)THEN NUMERIC-- 布尔WHEN c.udt_name boolTHEN BOOLEAN-- 日期/时间WHEN c.udt_name IN (date,time,timetz…

数据分析综合应用 30分钟精通计划

🔬 数据分析综合应用 30分钟精通计划(完整版含输出) ⏰ 时间分配 5分钟:数据加载与清洗基础 10分钟:探索性数据分析(EDA) 10分钟:数据分析实战案例 5分钟:分析报告生成 📚 第一部分:数据加载与清洗基础 (5分钟) 1. 模拟真实数据集 import pandas as pd import nu…

Python爬虫实战:研究psd-tools库相关技术

一、引言 1.1 研究背景 Adobe Photoshop 是目前最流行的图像处理软件之一,其原生文件格式 PSD(Photoshop Document)包含了丰富的图像信息和编辑历史。PSD 文件不仅在设计领域广泛使用,还在数字营销、版权保护和安全分析等领域具有重要价值。然而,手动分析大量 PSD 文件是…

基于卷积傅里叶分析网络 (CFAN)的心电图分类的统一时频方法

一、研究背景与核心问题​​ECG分类的挑战​&#xff1a;心电图&#xff08;ECG&#xff09;信号分类在心律失常检测、身份识别等领域至关重要&#xff0c;但传统方法难以同时有效整合时域和频域信息。现有方法包括&#xff1a;​时域分类&#xff08;CNN1D&#xff09;​​&am…

Linux——LinuxOS

cd,pwd,mkdir,rm,ls,touch,cat,echo,

深度学习篇---矩阵

在机械臂解算、深度学习网络等硬件和软件领域中&#xff0c;矩阵运算作为核心数学工具&#xff0c;承担着数据表示、变换、映射和优化的关键作用。以下从具体领域出发&#xff0c;详细总结涉及的矩阵运算及对应的核心知识&#xff1a;一、机械臂解算领域机械臂解算&#xff08;…

元宇宙:技术乌托邦与数字化未来——基于技术哲学的分析

一、技术哲学视域下的元宇宙本质哲学源流与技术基因的双重映射理想世界的千年回响&#xff1a;从柏拉图洞穴隐喻中的影子世界&#xff0c;到普特南“钵中之脑”对虚拟与现实界限的消弭&#xff0c;元宇宙的构想深植于人类对平行世界的永恒追问。中国传统神话中“天人二元结构”…

如何构建一个基于大模型的实时对话3D数字人?

近年来&#xff0c;随着元宇宙和AIGC技术的爆发&#xff0c;3D数字人从影视特效走向日常应用。无论是虚拟主播、AI客服&#xff0c;还是数字教师&#xff0c;其核心诉求都是**“能听、会说、有表情”**的实时交互能力。本文就带大家了解如何构建一个基于大模型的实时对话的3D数…

NULL值处理:索引优化与业务设计实践指南

一、NULL值的本质与影响NULL值在数据库中代表"未知状态"或"不适用"的特殊标记&#xff0c;与空字符串或0有本质区别12。其特性导致以下业务与性能问题&#xff1a;‌语义复杂性‌&#xff1a;NULL可能表示"未填写"(如用户手机号)或"不适用&…

【add vs commit】Git 中的 add 和 commit 之间的区别

关于git add和git commit还有一些有点不太清楚的地方&#xff0c;这里写一篇文章好好理一理git add&#xff1a;添加到暂存区 git add实际上是把工作区中的内容存入“暂存区” 通俗来讲就是告诉Git&#xff1a;“这些文件我准备好commit了” git add file.txt # 添加单个文件 …

【推荐100个unity插件】使用C#或者unity实现爬虫爬取静态网页数据——Html Agility Pack (HAP)库和XPath 语法的使用

文章目录前言一、安装HtmlAgilityPack1、从NuGet下载HtmlAgilityPack包2、获取HtmlAgilityPack.dll二、HtmlAgilityPack常用操作1、加载 HTML2、查询方式2.1 使用 XPath 查询&#xff08;推荐&#xff09;2.2 使用 LINQ 查询3、常用查询操作3.1 选择节点3.2 获取属性值3.3 遍历…

用 urllib 开启爬虫之门:从零掌握网页数据抓取

在数字时代&#xff0c;数据就是力量。作为一名社会工作者&#xff0c;或许你想了解城市服务资源&#xff1b;作为一个编程初学者&#xff0c;你可能希望从网页中自动提取新闻、课程或公开数据。今天&#xff0c;我们就来讲一讲 Python 标准库中的一把“钥匙”——urllib 库&am…

Spring Boot 订单超时自动取消的 3 种主流实现方案

Spring Boot 订单超时自动取消的 3 种主流实现方案关键词&#xff1a;Spring Boot、订单超时、延迟任务、RabbitMQ、Redis、定时任务在电商、外卖、票务等业务中&#xff0c;“下单后若 30 分钟未支付则自动取消”是一道经典需求。实现方式既要保证 实时性&#xff0c;又要在 高…

0401聚类-机器学习-人工智能

文章目录一 无监督学习什么是无监督学习&#xff1f;核心特点&#xff1a;无监督学习的主要类型1. 聚类分析 (Clustering)2. 降维 (Dimensionality Reduction)3. 关联规则学习 (Association Rule Learning)4. 异常检测 (Anomaly Detection)5. 密度估计 (Density Estimation)二 …

基础神经网络模型搭建

nn 包提供通用深度学习网络的模块集合&#xff0c;接收输入张量&#xff0c;计算输出张量&#xff0c;并保存权重。通常使用两种途径搭建 PyTorch 中的模型&#xff1a;nn.Sequential和 nn.Module。 nn.Sequential通过线性层有序组合搭建模型&#xff1b;nn.Module通过__init__…

基于单片机出租车计价器设计

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 本设计实现了一种基于单片机的智能化出租车计价系统。系统以单片机为核心处理器&#xff0c;集成…

134. Java 泛型 - 上限通配符

文章目录134. Java 泛型 - 上限通配符 (? extends T)**1. 什么是上限通配符 (? extends T)&#xff1f;****2. 为什么使用 ? extends T&#xff1f;****3. 示例&#xff1a;使用 ? extends T 进行数据读取****✅ 示例 1&#xff1a;计算数值列表的总和****4. 注意事项&…

【1】YOLOv13 AI大模型-可视化图形用户(GUI)界面系统开发

【文章内容适用于任意目标检测任务】【GUI界面系统不局限于YOLOV13&#xff0c;主流YOLO系列模型同样适用】本文以车辆行人检测为背景&#xff0c;介绍基于【YOLOV13模型】和【AI大模型】的图形用户&#xff08;GUI&#xff09;界面系统的开发。助力大论文实现目标检测模型的应…