当前位置: 首页 > news >正文

【Spring】深入理解 Spring 事务管理

文章目录

  • 一、事务的基本概念​
      • 原子性(Atomicity)
      • 一致性(Consistency)
      • 隔离性(Isolation)
      • 持久性(Durability)
  • 二、Spring 事务管理的优势​
      • 简化事务管理代码
      • 提供多种事务管理方式
      • 整合多种持久化技术
  • 三、Spring 事务管理的核心接口​
      • PlatformTransactionManager
      • TransactionDefinition
      • TransactionStatus
  • 四、事务传播行为​
  • 五、事务隔离级别​
  • 六、声明式事务管理​
  • 七、事务的回滚规则​
  • 八、事务失效场景​

在当今的企业级应用开发中,数据的一致性和完整性是至关重要的。而 Spring 框架提供的事务管理功能,为我们解决这一关键问题提供了强大的支持。本文将深入探讨 Spring 事务管理的相关知识,帮助大家更好地理解和运用它。​

一、事务的基本概念​

事务是一组逻辑操作单元,这些操作要么全部成功,要么全部失败。例如在银行转账场景中,从账户 A 向账户 B 转账 100 元,涉及到从账户 A 扣款 100 元和向账户 B 存款 100 元两个操作,这两个操作必须作为一个整体来执行,要么都成功,否则就会导致数据不一致。事务具有 ACID 特性:​

原子性(Atomicity)

事务中的所有操作要么全部执行成功,要么全部失败回滚,就像一个原子一样不可分割。​

一致性(Consistency)

事务执行前后,数据库的完整性约束没有被破坏,数据从一个一致性状态转换到另一个一致性状态。​

隔离性(Isolation)

多个事务并发执行时,一个事务的执行不能被其他事务干扰,各个事务之间相互隔离。​

持久性(Durability)

一旦事务提交成功,对数据库所做的修改就会永久保存下来,即使系统发生故障也不会丢失。​

二、Spring 事务管理的优势​

简化事务管理代码

传统的 JDBC 事务管理需要编写大量的样板代码来处理事务的开始、提交、回滚等操作,而 Spring 通过声明式事务管理,让我们可以通过简单的配置或注解来管理事务,大大减少了代码量。​

提供多种事务管理方式

Spring 支持编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制事务,灵活性较高;声明式事务管理则通过配置或注解来指定事务的边界和属性,更符合面向切面编程(AOP)的思想,便于维护和管理。​

整合多种持久化技术

Spring 事务管理可以与多种持久化技术如 JDBC、Hibernate、JPA 等无缝集成,无论你使用哪种持久化技术,都能方便地进行事务管理。​

三、Spring 事务管理的核心接口​

PlatformTransactionManager

这是 Spring 事务管理的核心接口,它提供了事务管理的基本方法,如获取事务、提交事务、回滚事务等。不同的持久化技术对应不同的实现类,例如对于 JDBC,有 DataSourceTransactionManager;对于 Hibernate,有 HibernateTransactionManager 等。​

TransactionDefinition

该接口定义了事务的属性,包括事务的传播行为、隔离级别、超时时间、是否只读等。通过设置这些属性,可以灵活地控制事务的行为。​

TransactionStatus

代表一个事务的状态,通过它可以获取事务的相关信息,如是否新事务、是否已完成等,还可以手动回滚事务。​

四、事务传播行为​

事务传播行为定义了一个事务方法被另一个事务方法调用时,事务应该如何传播。Spring 定义了 7 种事务传播行为:​
PROPAGATION_REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。例如方法 A 调用方法 B,若方法 A 已经在一个事务中,方法 B 会加入方法 A 的事务;若方法 A 没有事务,方法 B 会创建一个新事务。​
PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。​
PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。​
PROPAGATION_REQUIRES_NEW:总是创建一个新事务。如果当前存在事务,则将当前事务挂起,直到新事务执行完毕。​
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作。如果当前存在事务,则将当前事务挂起。​
PROPAGATION_NEVER:以非事务方式执行操作。如果当前存在事务,则抛出异常。​
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务。嵌套事务可以独立于外部事务进行回滚或提交,但外部事务回滚时,嵌套事务也会回滚。​

五、事务隔离级别​

事务隔离级别用于解决多个事务并发执行时可能出现的问题,如脏读、不可重复读、幻读等。Spring 支持以下 5 种事务隔离级别:​
ISOLATION_DEFAULT:使用底层数据库默认的隔离级别。​
ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读。​
ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,避免了脏读,但可能会出现不可重复读和幻读。​
ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果是一致的,除非数据被当前事务本身修改,避免了脏读和不可重复读,但可能会出现幻读。​
ISOLATION_SERIALIZABLE:最高的隔离级别,完全串行化的事务,避免了脏读、不可重复读和幻读,但性能开销较大。​

六、声明式事务管理​

声明式事务管理是 Spring 推荐的事务管理方式,它基于 AOP 实现。在 Spring 中,可以通过 XML 配置或注解来实现声明式事务管理。

@Servicepublic class OrderService {@Autowiredprivate OrderDao orderDao;​
​@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)public void placeOrder(Order order) {​orderDao.save(order);}}

在@Transactional注解中可以指定事务的传播行为、隔离级别等属性。

七、事务的回滚规则​

默认情况下,Spring 事务在遇到运行时异常(RuntimeException 及其子类)和错误(Error)时会自动回滚事务,而遇到受检异常(Checked Exception)时不会自动回滚事务。但我们可以通过@Transactional注解的rollbackFor和noRollbackFor属性来指定回滚规则。​
1. rollbackFor:指定需要回滚事务的异常类型,例如:

@Transactional(rollbackFor = CustomBusinessException.class)public void businessMethod() {// 业务逻辑​
}

这里指定了遇到CustomBusinessException异常时回滚事务。​
2. noRollbackFor:指定不需要回滚事务的异常类型,例如:

@Transactional(noRollbackFor = DataAccessException.class)public void dataAccessMethod() {// 数据访问逻辑​
}

这里表示遇到DataAccessException异常时不回滚事务。

八、事务失效场景​

1. 方法内部调用:当一个类中的非事务方法调用同一类中的事务方法时,事务会失效。因为 Spring 的声明式事务是基于 AOP 代理实现的,在类内部方法调用时,并不会经过代理对象,事务增强逻辑也就不会生效。例如:

@Servicepublic class UserService {@Autowiredprivate UserDao userDao;​
​public void nonTransactionalMethod() {// 内部调用事务方法​transactionalMethod();}​
​@Transactionalpublic void transactionalMethod() {​userDao.save(new User());}}

在上述代码中,nonTransactionalMethod内部调用transactionalMethod,此时transactionalMethod上的事务不会生效。解决办法是将调用逻辑抽取到另一个被 Spring 管理的服务类中,通过依赖注入进行调用。​
2. 未被 Spring 管理的类:如果一个类没有被 Spring 容器管理,那么它上面的@Transactional注解不会生效。比如,在一个普通的 Java 类中使用@Transactional,事务不会起作用。确保所有需要事务管理的类都通过@Component、@Service、@Repository等注解交由 Spring 管理。​
3. 不支持事务的数据源:若使用的数据源本身不支持事务,如某些轻量级的嵌入式数据库默认不开启事务支持,那么即使配置了 Spring 事务管理,事务也无法正常工作。需要检查并确保所使用的数据源具备事务处理能力,并且正确配置了事务相关参数。​
4. 异常被捕获处理:当事务方法内部捕获了异常,却没有重新抛出运行时异常或错误,事务不会回滚。例如:

@Transactionalpublic void saveUser(User user) {try {​userDao.save(user);int i = 1 / 0; // 模拟异常​} catch (Exception e) {// 捕获异常但未抛出运行时异常​log.error("操作出错", e);}}

在这种情况下,事务不会回滚。正确做法是在捕获异常后,根据业务逻辑决定是否重新抛出运行时异常,如throw new RuntimeException(e)。​
5. 错误的事务传播机制设置:在使用事务传播行为时,如果设置不当,也可能导致事务失效。例如,将一个方法的事务传播行为设置为PROPAGATION_NOT_SUPPORTED,那么该方法内的事务操作实际上是在无事务环境下执行的。需要根据业务场景合理选择事务传播行为。​
6. 多线程调用:在多线程环境下,Spring 的事务管理基于线程绑定来工作。如果在一个线程中开启事务,然后在另一个线程中执行事务相关操作,事务上下文无法传递,导致事务失效。要避免在多线程场景下直接使用 Spring 事务管理,可考虑使用支持分布式事务的解决方案,如 Seata 等。

相关文章:

【Spring】深入理解 Spring 事务管理

文章目录 一、事务的基本概念​原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 二、Spring 事务管理的优势​简化事务管理代码提供多种事务管理方式整合…...

java学习笔记6

按住shift键,选择开始的一位和最后结束的一位来全选 面向对象特征之二:继承性(inheritance) 面向对象特征之二:继承性1.继承性的理解 > 生活上:财产的继承、颜值的继承 > 代码层面:> 自上而下:定义了一个类A,在定义另一个类B时&…...

人工智能在现代科技中的应用和未来发展趋势

人工智能(Artificial Intelligence,AI)是一种模拟人类智能思维和行为的技术,已经在现代科技中得到广泛应用。以下是人工智能在现代科技中的应用和未来发展趋势: 应用: 机器学习:机器学习是人工…...

第二十一章:模板与继承_《C++ Templates》notes

模板与继承 重点和难点编译与测试说明第一部分:多选题 (10题)第二部分:设计题 (5题)答案与详解多选题答案:设计题参考答案 测试说明 重点和难点 21.1 空基类优化(EBCO) 知识点 空基类优化(Empty Base Cla…...

STC89C52单片机学习——第35节: [16-1] AD/DA

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.23 51单片机学习——第35节: [16-1] AD/DA 前言开发板说明引用解答和科普一、AD问题…...

算法-最大公约数

1、约数: 1.1 试除法求约数 原理:只需要遍历最小的约数即可,较大的那个可以直接算出来。 import java.util.*; public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t sc.nextIn…...

在 SaaS 应用上构建 BI 能力的实战之路

SaaS 产品在持续运营过程中积累了大量数据,这些数据不仅是数字的记录,更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此,大部分的 SaaS 产品在发展到一定阶段后,都会开始构建自己的报表模块或分析模块,…...

代码随想录刷题day51|(二叉树篇)654.最大二叉树

一、二叉树基础知识 详见:代码随想录刷题day34|(二叉树篇)二叉树的递归遍历-CSDN博客 二、递归思路 递归三部曲 构造树一般采用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树; 1.递归函数参数…...

深入理解 C++11 智能指针:独占、共享与弱引用的完美管理

文章目录 std::unique_ptr(独占式智能指针)std::shared_ptr(共享式智能指针)std::weak_ptr(弱引用智能指针)示例展示:智能指针的原理内存泄漏**什么是内存泄漏,内存泄漏的危害****如…...

1.2 编译器结构

编译器具有模块化的高层结构。还可以将模块化进一步细化。编译器可以看成多个阶段构成的流水线结构。 一种没有优化的编译器结构 更复杂的编译器结构...

文件操作助手

文件操作助手 在我们实现一个大型项目时,往往会有一个公共模块,这个公共模块是公用的,里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手… 而我们今天就来实现一个文件操作助手,里面包含的功能有: 判断…...

线段树与扫描线 —— 详解算法思想及其C++实现

目录 一、线段树(Segment Tree) 基本概念 结构 操作 示例代码 二、扫描线(Sweep Line) 基本概念 应用场景 示例代码(矩形面积并集) 三、总结 一、线段树(Segment Tree) 基本…...

Leetcode 刷题笔记1 图论part04

leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…...

快速入手:Nacos融合SpringCloud成为注册配置中心

快速入手:Nacos融合SpringCloud成为注册配置中心 前言安装Nacos项目搭建添加配置启动类添加注解运行项目服务调用RestTemplate 模式FeignClient 模式 前言 Spring Cloud是一系列框架的集合,提供了微服务架构下的各种解决方案,如服务治理、配…...

others-rustdesk远程

title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...

go:前后端分离

1.前端代码 新建一个前端文件夹,在该文件夹下新建一个.html文件,写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下: func main() { // 服务运行提示 fmt.Println("go web server is runn…...

lodash 学习笔记/使用心得

lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得,最近也是打算清理一下所有的 dead code,然后发现我们用了好多的 lodash 方法。对比了之前的写法,重新看了一下官方文档,再自己重新动手写了点 util 之后发现…...

网络爬虫【爬虫库request】

我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上&…...

AI日报 - 2025年3月24日

🌟 今日概览(60秒速览) ▎🤖 AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优,推理速度提升高达12万倍 ▎💼 商业动向 | OpenAI用户破4亿,Meta与Reliance探讨AI合作 生态扩展与全…...

Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现

一、前言 在移动互联网蓬勃发展的今天,视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议,开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV(Flash Video)格式,尽管随着H…...

动态规划——混合背包问题

动态规划——混合背包问题 混合背包问题01背包与完全背包的混合:完全背包与多重背包的混合:三种背包混合混合背包OJ汇总 混合背包问题 将01背包、完全背包、多重背包混合起来的背包问题。也就是说,有的物品只可以取一次(01背包&a…...

数据库操作练习

一.向heros表中新增一列信息,添加一些约束,并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束,设置自增 alter table heros modify column id int auto_increment primary key;//name列…...

3.milvus索引-HNSW

索引作用 加速大型数据集上的查询。 向量字段,仅只能创建一个索引。 milvus支持的向量索引类型大部分使用 近似最近邻搜索算法。ANNS该算法的核心不局限于返回最准确的结果,而是仅搜索目标的邻居。ANNS通过在可接受的范围内牺牲准确性提高检索效率。 …...

算法基础——栈

一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶,另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素,出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…...

开发语言漫谈-groovy

groovy是一门脚本语言,在前期的脚本语言中简单介绍了下。现在再深入介绍下,因为它是本平台上选用的脚本语言。所谓脚本语言就是不用编译,直接执行。这种特色非常适合做嵌入编程,即编即用。我们知道平台后台的业务开发语言是Java&a…...

ArkUI-List组件

列表是一个复杂的容器,当列表项达到一定数量,使得列表内容超出其范围的时候,就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用,条件渲染,循环渲染,懒加载等渲染控制方式生成子组件…...

数据仓库的 DWD 分层架构:构建高效数据平台的基石

在数据驱动的时代,数据仓库(Data Warehouse)作为企业数据分析的核心基础设施,扮演着至关重要的角色。而数据仓库的分层设计,则是确保数据高效流转、提升数据质量、支持复杂分析的关键。本文将深入探讨数据仓库的 DWD 分…...

山东大学数据结构课程设计

题目:全国交通咨询模拟系统 问题描述 处于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能地短,出门旅游的旅客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编织一个全国城市间的交…...

动态规划-01背包

兜兜转转了半天,发现还是Carl写的好。 看过动态规划-基础的读者,大概都清楚。 动态规划是将大问题,分解成子问题。并将子问题的解储存下来,避免重复计算。 而背包问题,就是动态规划延申出来的一个大类。 而01背包&…...

【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)

项目完整功能以演示视频为准 基于Node.js的中医药科普平台的设计与实现功能结构图如下 课题背景 随着人们健康意识的提高,中医药作为传统医学的重要组成部分,越来越受到关注。然而,中医药知识专业性强,普通大众获取准确、全面的中…...

基于Flux模型的多模态可控图像生成工作流实践

一、技术框架与模型选型 当前图像生成领域对多模态控制与一致性保持的需求日益增强,本文将基于Black Forest Labs推出的Flux.1模型,结合ControlNet的循环一致性优化技术,构建一套融合Canny边缘检测与深度图(Depth)控制…...

缓存过期时间之逻辑过期

1. 物理不过期(Physical Non-Expiration) 定义:在Redis中不设置EXPIRE时间,缓存键永久存在(除非主动删除或内存淘汰)。目的:彻底规避因缓存自动过期导致的击穿(单热点失效&#xff…...

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段:加载(Loading)、验证&a…...

第三十二篇 深入解析Kimball维度建模:构建企业级数据仓库的完整框架

目录 一、维度建模设计原则深度剖析1.1 业务过程驱动设计1.2 星型模式VS雪花模式 二、维度建模五步法实战(附完整案例)2.1 业务需求映射2.2 模型详细设计2.3 缓慢变化维处理 三、高级建模技术解析3.1 渐变维度桥接表3.2 快照事实表设计 四、性能优化体系…...

WPF 布局中的共性尺寸组(Shared Size Group)

1. 什么是共性尺寸组? 在 WPF 的 Grid 布局中,SharedSizeGroup 允许多个 Grid 共享同一列或行的尺寸,即使它们属于不同的 Grid 也能保持大小一致。这样可以保证界面元素的对齐性,提高布局的一致性。 SharedSizeGroup 主要用于需…...

19 数码管的动态显示

1、八段数码管 八段数码管 是一个 “ 8 ” 字型数码管,分为八段,a b c d e f g dp,其中dp为小数点。每一段为一个发光二极管,这样的 8 段称为 段选信号 。 2、实验 1、实验目标:让六位数码管 从 0 开始记数&#xff0…...

pytorch 笔记:张量索引的维度扩展规则

1 基本原理 在PyTorch中,张量索引的维度扩展规则遵循以下原则: 索引操作的核心规则:​ 当使用索引数组访问张量时: 索引数组的每个元素对应选取原张量的一个子张量结果形状 索引数组形状 原张量剩余维度形状 这么说可能不清…...

课外活动:怎么理解可变成本?

可变成本深度解析 🧮 一、可变成本的本质 #mermaid-svg-qoqQaFxQBuZZfAD2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qoqQaFxQBuZZfAD2 .error-icon{fill:#552222;}#mermaid-svg-qoqQaFxQBuZZfAD2 …...

深入理解 JVM 的垃圾收集器:CMS、G1、ZGC

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法

本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期:2025年3月22日 作者:任聪聪 现象描述: 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…...

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长,交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求,而监控视频平台的出现,则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...

括弧匹配检验(信息学奥赛一本通-1354)

【题目描述】 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ &#xff3…...

MacOS安装 nextcloud 的 Virtual File System

需求 在Mac上安装next cloud实现类似 OneDrive 那样,文件直接保存在服务器,需要再下载到本地。 方法 在 官网下载Download for desktop,注意要下对版本,千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...

【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别

文章目录 前言级联分类器FaceDetectorYNFaceRecognizerSF1. 特征提取2. 人脸对比3. 人脸身份识别(最佳匹配法) 总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Windows系统,LabVIEW>…...

C++-C++中的几种cast

文章目录 static_castPOD类型互转任意指针类型与void*互转基类继承类之间的互转具有目标类型转换函数的类/单参数的构造函数 dynamic_castreinterpret_cast static_cast 所谓static,意思是在编译期进行的转换,static_允许如下转换: POD类型…...

list的模拟实现和学习

1. list的介绍及使用 说白了就是带头循环双向循环链表 stl 的两大组件就是容器和算法 ,他们两个之间是通过迭代器进行联系的 这三种算法函数 迭代器的种类 性质(容器底层结构决定) 单项: forward_list /哈希(unord…...

程序代码篇---Pyqt的密码界面

文章目录 前言一、代码二、代码解释2.1用户数据库定义2.2窗口初始化2.3认证逻辑2.5角色处理2.6错误处理优化2.7功能扩展说明2.7.1用户类型区分管理员普通用户其他用户 2.7.2安全增强建议 三、运行效果四、运行命令五、界面改进建议5.1密码显示5.2用户头像显示5.3输入框动画效果…...

设计模式的六大原则

设计模式的六大原则 1. 单一职责原则 (Single Responsibility Principle, SRP) 一个类应该只负责一项职责。 示例代码 // 不好的设计:一个类承担多个职责 typedef struct {void (*read_data)(void);void (*process_data)(void);void (*save_data)(void);void (*…...

【Linux】信号:信号保存和处理

🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达:每个信号都有一个默认行为,例如终…...

Linux 线程概念

目录 一、什么是线程 1. 线程的本质 2. 线程的独有资源 3. 进程与线程关系示意图 二、线程的优缺点 2.1 线程的优点 2.2 线程的缺点 三、线程的异常与用途 1. 线程异常 2. 线程用途 四、进程 VS 线程 1. 核心差异 2. 进程的多个线程共享的资源 3. 进程和线程的关…...