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

Spring 中的事务

🧾 一、什么是事务?

🧠 通俗理解:

事务 = 一组操作,要么全部成功,要么全部失败,不能只做一半。

比如你转账:

  • A 账户扣钱
  • B 账户加钱

如果 A 扣了钱但 B 没收到,那就出问题了!这就是 数据不一致,事务就是为了解决这类问题。

✅ 二、事务的四大特性(ACID)

特性解释
原子性(Atomicity)要么全部成功,要么全部失败
一致性(Consistency)操作前后数据处于一致状态
隔离性(Isolation)多个事务互不干扰
持久性(Durability)提交后的数据是永久保存的

💡 三、Spring 中的事务管理方式

Spring 支持两种事务管理方式:

1. 编程式事务管理(不常用)

手动写事务边界,代码控制事务提交/回滚。

TransactionStatus status = txManager.getTransaction(...);
try {// 业务代码txManager.commit(status);
} catch (Exception e) {txManager.rollback(status);
}

🚫 缺点:代码侵入性强、重复、易出错。实际开发中不推荐。

2. 声明式事务管理 ✅(主流)

通过注解或配置来管理事务,干净、简洁、优雅!

@Service
public class AccountService {@Transactionalpublic void transfer() {// 扣钱// 加钱// 如果中间出异常,自动回滚}
}

📌 四、@Transactional 注解详解

@Transactional 是 Spring 中声明事务的注解,作用范围可以是类或方法。

常用属性:

属性含义
propagation事务传播行为(默认 REQUIRED
isolation事务隔离级别
rollbackFor指定哪些异常触发回滚(默认是运行时异常)
readOnly是否只读事务
timeout设置事务超时时间

🔄 五、事务的传播行为(重点)

行为含义
REQUIRED(默认)有事务就加入,没有就新建
REQUIRES_NEW每次都新建一个事务,原事务挂起
NESTED嵌套事务,有独立的回滚点
SUPPORTS有事务就用,没有就不用
NOT_SUPPORTED不支持事务,挂起当前事务
NEVER当前不能存在事务,否则抛异常
MANDATORY必须存在事务,否则抛异常

🔒 六、事务隔离级别(对应数据库的)

隔离级别解决的问题说明
DEFAULT使用数据库默认
READ_UNCOMMITTED脏读最低,性能高但不安全
READ_COMMITTED不可重复读常用,如 Oracle 默认
REPEATABLE_READ幻读MySQL 默认
SERIALIZABLE最强隔离安全但性能差

💣 七、事务生效的注意事项(易踩坑)

🚨 1. 事务方法必须是 public

@Transactional // 正确
public void doSomething() {}

🚨 2. 方法 不能是同一个类中内部调用

// 错误示例:事务不起作用
public void outer() {this.inner(); // 没经过代理
}

✅ 正确做法:通过代理调用

  • 注入自身(@Lazy 方式)
  • 拆到 Service 层让 Spring 来代理调用

🚨 3. 默认只对 运行时异常 回滚

@Transactional(rollbackFor = Exception.class)

🧪 八、事务管理器(Spring 内部机制)

Spring 通过 PlatformTransactionManager 接口进行统一管理。

常用实现类:

实现类场景
DataSourceTransactionManager使用 JDBC、MyBatis
JpaTransactionManager使用 JPA/Hibernate
ChainedTransactionManager多数据源事务

✅ 九、一句话总结

Spring 的事务机制让你只关心业务逻辑,不用手动管理事务,声明式的方式简洁高效,是真正的企业级利器。

@Transactional 实现原理

它的实现原理非常巧妙,实际上是通过 AOP(面向切面编程)代理机制 实现的。这一机制让你无需写一行事务管理的代码,Spring 会自动为你处理。

我们一起来详细剖析一下底层原理!🧠

💡 一、核心原理概览

1. AOP + 代理

@Transactional 注解是基于 AOP(面向切面编程)实现的,具体来说,Spring 会为标记了 @Transactional 注解的方法创建一个代理对象,这个代理对象会在方法执行前后进行事务的开启、提交和回滚等处理。

2. 动态代理

Spring 通过动态代理技术(JDK 代理或 CGLIB 代理)生成一个代理对象,这个对象会拦截你的方法调用,在方法调用前后进行事务管理的相关操作。

3. 事务管理器

Spring 会利用配置的 事务管理器(PlatformTransactionManager 来处理事务的开启、提交、回滚等操作。

🛠️ 二、@Transactional 的工作流程

步骤 1:创建代理对象

  • 代理方式:Spring 使用 JDK 动态代理CGLIB 代理 来生成代理对象。默认情况下,如果目标类实现了接口,Spring 会使用 JDK 动态代理;如果没有实现接口,则使用 CGLIB 创建子类代理。

步骤 2:事务管理器的配置

  • @Transactional 依赖于 事务管理器 来执行事务操作,Spring 根据你配置的 PlatformTransactionManager 来管理事务。常见的事务管理器有:
    • DataSourceTransactionManager:用于 JDBC。
    • JpaTransactionManager:用于 JPA(如 Hibernate)。
    • HibernateTransactionManager:用于 Hibernate。

步骤 3:方法执行前,开启事务

当你调用被 @Transactional 注解标记的方法时,Spring 代理会拦截这个方法的调用,首先会判断当前方法是否需要开启新事务(即,方法的传播行为是 REQUIRED)。如果需要开启新事务,则会通过 事务管理器 启动一个新的事务。

  • 事务的传播行为(propagation:比如,REQUIRED 表示如果当前没有事务,就新建一个事务,如果已有事务,就加入到当前事务中。

步骤 4:方法执行中,进行事务操作

方法执行过程中,Spring 会维持该事务的状态,直到方法执行完毕。

  • 事务隔离级别(isolation:隔离级别决定了事务之间如何互相影响(比如,是否允许脏读、不可重复读等)。

步骤 5:方法执行后,提交或回滚事务

  • 方法正常完成:如果方法执行没有异常,Spring 会在方法结束后提交事务。
  • 方法出现异常:如果方法抛出异常,Spring 会根据 @Transactional 配置的异常回滚规则,判断是否回滚该事务。

⚙️ 三、事务管理的关键组件

1. TransactionInterceptor:核心事务拦截器

  • Spring 使用 TransactionInterceptor 来处理所有带有 @Transactional 注解的方法,它是事务管理的关键拦截器。
  • 该拦截器负责从容器中获取事务管理器、根据事务配置设置事务属性(如隔离级别、传播行为等),并且控制事务的开启、提交和回滚。

2. TransactionProxyFactoryBean:生成代理对象

  • TransactionProxyFactoryBean 是 Spring 用来创建事务代理的工厂,实际上它会根据注解或配置生成一个代理对象。
  • 这个代理对象会拦截对事务方法的调用,并在调用方法前后进行事务的处理。

3. PlatformTransactionManager:事务管理器

  • 事务管理器(如 DataSourceTransactionManager)负责实际的事务操作,包括开启事务、提交事务、回滚事务等。

🔍 四、事务处理的实际步骤

  1. 方法调用被代理对象拦截
    • @Transactional 标记的方法会被 AOP 代理拦截,调用 TransactionInterceptor
  2. 事务拦截器执行逻辑
    • TransactionInterceptor 会根据 @Transactional 配置,从容器中获取 事务管理器PlatformTransactionManager)。
  3. 判断事务传播行为
    • 如果当前没有事务(例如没有正在进行的事务),根据传播行为决定是否新建事务。默认是 REQUIRED,即如果没有事务,创建一个新的事务。
  4. 开启事务
    • 通过 PlatformTransactionManager 开启一个事务(实际是对底层数据库操作的封装)。
  5. 执行目标方法
    • 目标方法执行,在方法内的操作都在同一个事务中进行。
  6. 提交或回滚事务
    • 如果方法执行没有抛出异常,Spring 提交事务;如果抛出指定异常(如运行时异常),Spring 会回滚事务。

💡 五、示例:@Transactional 事务的底层工作

假设你有一个服务类 AccountService,方法 transfer()@Transactional 注解标记:

@Service
public class AccountService {@Transactionalpublic void transfer() {// 扣款操作// 加款操作// 如果中间出错,Spring 会自动回滚}
}
  • Spring 会生成一个代理对象 AccountService,拦截 transfer() 方法调用。
  • 代理对象通过 TransactionInterceptor 来控制事务的开启、提交或回滚。
  • 在调用 transfer() 方法之前,Spring 会检查是否需要开启事务,创建事务并将其绑定到当前线程(一般是通过 ThreadLocal 来绑定)。
  • transfer() 执行完后,如果没有异常,Spring 会提交事务;如果出现异常,Spring 会根据配置回滚事务。

🧠 六、总结

@Transactional 的底层原理依赖于 AOP + 动态代理,通过 事务拦截器TransactionInterceptor)和 事务管理器PlatformTransactionManager)来实现事务的控制。Spring 提供了灵活的事务传播行为和隔离级别,让事务控制变得更加简单和清晰。

Spring 事务在什么情况下会失效?

1. 方法是 privateprotected

Spring 的事务管理是基于 AOP(面向切面编程) 实现的,而 AOP 需要代理对象来执行方法。如果方法是 privateprotected,Spring 的 AOP 代理是无法拦截到该方法的,因此事务无法生效。

解决方法:

  • 将事务方法设置为 public,这样 Spring 的代理对象才能正确地拦截并应用事务。
@Transactional
public void transfer() { // 必须是 public// 业务逻辑
}

2. 在同一类内调用事务方法

当一个类内部的事务方法相互调用时,事务是不会生效的。这是因为 事务代理 是基于代理对象的,而类内部方法调用是直接调用对象的方法,不会经过代理。

例子:

@Service
public class AccountService {@Transactionalpublic void transfer() {// 扣款操作this.otherMethod(); // 调用同一个类中的方法}@Transactionalpublic void otherMethod() {// 加款操作}
}

在这个例子中,transfer() 调用了 otherMethod(),但 @Transactional 注解没有生效,因为调用 this.otherMethod() 是直接调用类内部的方法,不会经过代理。

解决方法:

  • 拆分方法,将事务性方法提取到另一个服务类中,确保 Spring 代理对象能够接管方法调用。

3. 没有配置事务管理器

Spring 中的事务是依赖于 PlatformTransactionManager 来进行管理的。如果没有配置或注入正确的事务管理器,事务就无法生效。

解决方法:

  • 确保在 applicationContext.xmlSpring Boot 配置类中配置了正确的事务管理器。

Spring Boot 示例:

@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {return new JpaTransactionManager(entityManagerFactory);}
}

4. 事务方法抛出了非 RuntimeException 异常

Spring 默认只对 运行时异常 (RuntimeException 和其子类) 回滚事务。如果你在方法中抛出了一个 检查型异常(checked exception(如 IOExceptionSQLException 等),默认情况下,Spring 不会回滚事务。

解决方法:

  • 使用 @TransactionalrollbackFor 属性来指定哪些异常需要回滚事务。
@Transactional(rollbackFor = Exception.class)  // 指定回滚异常
public void transfer() throws IOException {// 业务逻辑
}

5. 事务被 @Transactional 注解的代理方法外部调用

Spring 的事务管理依赖于 代理对象,如果事务方法被其他 非 Spring 管理的对象调用,Spring 的事务也不会生效。

解决方法:

  • 确保事务方法仅通过 Spring 管理的代理对象来调用。避免手动调用 new 创建的对象或外部非 Spring 管理的对象。

6. 事务的传播行为不正确

事务的传播行为(propagation)控制了事务的嵌套和传播方式。如果设置不当,事务可能不会按预期工作。

例如,如果你使用了 REQUIRES_NEW 传播行为,每次方法都会启动一个新的事务,原事务会被挂起。如果这时原事务出现问题,它就无法回滚。

解决方法:

  • 确保事务的传播行为与业务场景相匹配。常见的设置是 REQUIRED(默认),它会加入当前事务,如果没有事务,则创建一个新的事务。
@Transactional(propagation = Propagation.REQUIRED)
public void transfer() {// 事务逻辑
}

7. 非事务方法调用事务方法时,事务失效

如果一个非事务方法调用了带有 @Transactional 的方法,在一些情况下事务不会生效。特别是在 非 Spring 管理的对象 上,事务不会生效。

解决方法:

  • 确保事务方法是由 Spring 管理的代理对象来调用,避免在非 Spring 管理的对象中调用事务方法。

8. 只读事务修改数据

@Transactional 中的 readOnly 属性告诉 Spring 该事务是只读的。如果在只读事务中执行了写操作(比如更新数据库),在某些数据库系统中事务可能不会按预期提交,甚至会抛出异常。

解决方法:

  • 确保只读事务只用于查询操作,避免在只读事务中执行写操作。
@Transactional(readOnly = true)
public List<User> getAllUsers() {return userRepository.findAll();
}

🚦 九、总结

Spring 事务失效的常见原因:

  1. 事务方法是 privateprotected
  2. 方法在同一类中被调用(直接调用,未通过代理)。
  3. 没有配置事务管理器
  4. 抛出了非 RuntimeException 异常
  5. 事务方法被非 Spring 管理的对象外部调用
  6. 事务的传播行为设置不当
  7. 非事务方法调用事务方法时,事务失效
  8. 只读事务进行数据修改

避免失效的建议:

  • 确保事务方法是 public
  • 使用 Spring 管理的代理对象来调用事务方法。
  • 正确配置事务管理器。
  • 根据需求调整 rollbackForpropagation 配置。
  • 使用 readOnly 标记仅进行查询的事务。

相关文章:

Spring 中的事务

&#x1f9fe; 一、什么是事务&#xff1f; &#x1f9e0; 通俗理解&#xff1a; 事务 一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;不能只做一半。 比如你转账&#xff1a; A 账户扣钱B 账户加钱 如果 A 扣了钱但 B 没收到&#xff0c;那就出问…...

2025-04-06 NO.2 Quest3 基础配置与打包

文章目录 1 场景配置1.1 开启手势支持1.2 创建 OVRCameraRig1.3 创建可交互 Cube 2 打包配置 环境&#xff1a; Windows 11Unity6000.0.42f1 Quest3 开发环境配置见 2025-03-17 NO.1 Quest3 开发环境配置教程_quest3 unity 开发流程-CSDN博客。 1 场景配置 1.1 开启手势支持 …...

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…...

LeetCode 每日一题 2025/3/31-2025/4/6

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/31 2278. 字母在字符串中的百分比4/1 2140. 解决智力问题4/2 2873. 有序三元组中的最大值 I4/3 2874. 有序三元组中的最大值 II4/4 1123. 最深叶节点的最近公共祖先4/5 1…...

mybatis plus 实体类基于视图,更新单表的时候报视图或函数‘v_视图名‘不可更新,因为修改会影响多个基表的错误的简单处理方法。

1、之前的文章中写了一下基于视图的实体&#xff0c;因为当前测试通过了&#xff0c;可能有缓存。 2、然后今天又用到了这个方法&#xff0c;发现报错了&#xff1a; 建了一下视图&#xff0c;将实体类绑定到了视图中&#xff0c;并不是原表中。 3、用mybatis提供的注解或者x…...

语法: i8=make8( var, offset);

MAKE8( ) 语法: i8make8( var, offset); 参数: var是16位或32位整数; offset是字节的偏移量,为1,2或3; 返回值: 返回值是一个8位整数; 功能: 该函数用来摘取以var为基址, offset为偏移量,所指向单元的字节;除了执行单字节复制之外,还相当于i8( ( var>>(offset…...

Seata TCC模式是怎么实现的?

Seata TCC 模式实现原理 TCC(Try-Confirm-Cancel)是 Seata 提供的分布式事务解决方案之一,适用于 高并发、高性能 场景,通过 业务补偿 保证最终一致性。其核心思想是将事务拆分为三个阶段: Try:预留资源(冻结数据,检查约束)。Confirm:确认提交(真正扣减资源)。Can…...

sentinel新手入门安装和限流,热点的使用

1 sentinel入门 1.1下载sentinel控制台 &#x1f517;sentinel管理后台官方下载地址 下载完毕以后就会得到一个jar包 1.2启动sentinel 将jar包放到任意非中文目录&#xff0c;执行命令&#xff1a; java -jar 名字.jar如果要修改Sentinel的默认端口、账户、密码&#xff…...

对责任链模式的理解

对责任链模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1100)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用责任链模式1、代码2、缺点 三、采用责任链模式1、代码2、优点 四、思考 一、场景 1、题目【来源】 …...

AGI大模型(11):RAG系统

1 RAG概念 RAG(Retrieval Augmented Generation)顾名思义,通过检索外部数据,增强大模型的生成效果。 RAG即检索增强生成,为LLM提供了从某些数据源检索到的信息,并基于此修正生成的答案。RAG基本上是Search + LLM 提示,可以通过大模型回答查询,并将搜索算法所找到的信…...

请问你了解什么测试方法?

测试方法在软件测试中是保障软件质量的关键手段,我将从黑盒测试、白盒测试、灰盒测试等方面为你介绍常见的测试方法: 黑盒测试方法 黑盒测试把软件看作一个黑盒子,不考虑内部结构和实现细节,只关注输入和输出。 等价类划分法:将输入数据划分为有效等价类和无效等价类,从…...

【springcloud】快速搭建一套分布式服务springcloudalibaba(三)

第三篇 基于nacos搭建分布式项目 分布式事务&#xff08;分布式锁事务&#xff09; 项目所需 maven nacos java8 idea git mysql(下单) redis(分布式锁) 本文主要讲解客户下单时扣减库存的操作&#xff0c;网关系统/用户系统/商品系统/订单系统 请先准备好环境&#xff0…...

Nginx-keepalived-高可用

Nginx 高可用 通常 借助 Keepalived 实现&#xff0c; Keepalived 能通过 VRRP &#xff08;虚拟路由冗余协议&#xff09;让多个 Nginx 服务器 组成一个 热备集群&#xff0c;当主服务器故障时自动切换到备用服务器&#xff0c;保障服务不间断。 一、环境准备 角色IP 地址主…...

Linux系统管理(十九)——欧拉系统硬盘挂载、网络配置以及Docker环境安装

挂载硬盘 如果数据盘在安装操作系统的时候没有挂载&#xff0c;需要自己做一下硬盘的挂载 查看需要挂载硬盘的路径 fdisk -l这里的可挂载的硬盘路径为&#xff1a;/dev/sdb MBR分区方式转换成GPT MBR分区能挂载的硬盘空间有限&#xff0c;无法挂载全部硬盘空间&#xff0…...

vue记忆卡牌游戏

说明&#xff1a; 我希望用vue做一款记忆卡牌游戏 游戏规则如下&#xff1a; 游戏设置&#xff1a;使用3x4的网格&#xff0c;包含3对字母&#xff08;A,B,C,D,E,F&#xff09;。 ​随机洗牌&#xff1a;初始字母对被打乱顺序&#xff0c;生成随机布局。 ​游戏流程&#xff1a…...

LearnOpenGL-笔记-其九

今天让我们完结高级OpenGL的部分&#xff1a; Instancing 很多时候&#xff0c;在场景中包含有大量实例的时候&#xff0c;光是调用GPU的绘制函数这个过程都会带来非常大的开销&#xff0c;因此我们需要想办法在每一次调用GPU的绘制函数时尽可能多地绘制&#xff0c;这个过程就…...

开源软件与自由软件:一场理念与实践的交锋

在科技的世界里&#xff0c;“开源软件”和“自由软件”这两个词几乎无人不知。很多人或许都听说过&#xff0c;它们的代码是公开的&#xff0c;可以供所有人查看、修改和使用。然而&#xff0c;若要细究它们之间的区别&#xff0c;恐怕不少朋友会觉得云里雾里。今天&#xff0…...

关于使用HAL_ADC_Start函数时为什么要放在while里的解释

HAL_ADC_Start() 是一个用于启动 ADC&#xff08;模数转换器&#xff09;转换的函数&#xff0c;那为什么有时候我们会看到它被放在 while 循环里呢&#xff1f;其实取决于你使用的是哪种ADC采样方式&#xff0c;我们来细说&#x1f447;&#xff1a; &#x1f9e0; 一、先搞清…...

Qt 入门 2 之窗口部件 QWidget

Qt 入门2之窗口部件 QWidget Qt Creator 提供的默认基类只有QMainWindow、QWidget和QDialog 这3种&#xff0c;这3种窗体也是以后用得最多的&#xff0c;QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而它们全部继承自QWidget。不仅如此,其实所有的窗…...

在 Windows 上安装 WSL Ubuntu 的完整避坑指南:从报错到成功运行

问题背景​​ 最近在尝试通过 ​​Windows Subsystem for Linux (WSL)​​ 安装 Ubuntu 时&#xff0c;遇到了一系列报错。最初的步骤是直接使用 wsl --install 命令&#xff0c;但安装完成后发现系统中并未自动安装默认的 Ubuntu 发行版。随后尝试通过命令行手动选择发行版&a…...

STM32看门狗原理与应用详解:独立看门狗 vs 窗口看门狗(上) | 零基础入门STM32第九十四步

主题内容教学目的/扩展视频看门狗什么是看门狗&#xff0c;原理分析&#xff0c;启动喂狗方法&#xff0c;读标志位。熟悉在程序里用看门狗。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、看门狗核心原理1.1 工作原理图解1.2 经典水桶比喻 二、STM32看门狗双雄…...

Hyperlane 框架路由功能详解:静态与动态路由全掌握

Hyperlane 框架路由功能详解&#xff1a;静态与动态路由全掌握 Hyperlane 框架提供了强大而灵活的路由功能&#xff0c;支持静态路由和动态路由两种模式&#xff0c;让开发者能够轻松构建各种复杂的 Web 应用。本文将详细介绍这两种路由的使用方法。 静态路由&#xff1a;简单…...

webpack js 逆向 --- 个人记录

网站 aHR0cDovL2FlcmZheWluZy5jb20v加密参数 参数加密位置 方法&#xff1a; 1. 构造自执行函数 !function(e) {// 加载器 }(// 模块1&#xff1b;// 模块2 )2. 找到js的加载器 3. 把上述代码放入第一步构造的自执行函数(完整扣取一整个加载器里的代码)&#xff0c;并用一…...

代码随想录回溯算法03

93.复原IP地址 本期本来是很有难度的&#xff0c;不过 大家做完 分割回文串 之后&#xff0c;本题就容易很多了 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;回溯算法如何分割字符串并判断是合法IP&#xff1f;| LeetCode&#xff1a;93.复原IP地址_哔哩哔…...

SOMEIP通信矩阵解读

目录 1 摘要2 SOME/IP通信矩阵详细属性定义与示例2.1 服务基础属性2.2 数据类型定义2.3 服务实例与网络配置参数2.4 SOME/IP-SD Multicast 配置&#xff08;SOME/IP服务发现组播配置&#xff09;2.5 SOME/IP-SD Unicast 配置2.6 SOME/IP-SD ECU 配置参数详解 3 总结 1 摘要 本…...

keys简单通用命令

目录 一、通配符匹配key 二、key的常用命令 1&#xff09;exists 判断某个key是否存在 2&#xff09;删除key 3&#xff09;expire设置key的过期时间、ttl查询key的过期时间 4&#xff09;type可以获取key对应的value的类型 一、通配符匹配key redis作为键值对类型的数据…...

Linux : 页表

目录 一 前言 二 深入理解页表 三 页表的实际组成 四 总结 一 前言 页表是我们之前在讲到Linux : 进程地址空间-CSDN博客的时候说到的&#xff0c;它是物理内存到进程程序地址空间的一个桥梁&#xff0c;通过它&#xff0c;物理内存的数据和代码才能映射到进程的程序地址空间…...

多智能体优秀开发框架

原文链接:https://i68.ltd/notes/posts/20250402-multi-agent/ motia-面向软件工程师的智能体框架 项目仓库:https://github.com/MotiaDev/motia 1.3k官方网站:https://motia.devMotia 允许开发人员在几分钟内创建&#xff0c;测试和部署生产就绪的 AI 代理&#xff0c;在一个…...

JavaScript创建对象与构造函数

目录 创建对象 一、创建对象的 5 种核心方式 1. 对象字面量&#xff08;直接量&#xff09; 2. 使用 Object.create() 3. 工厂模式 4. 构造函数模式 5. ES6 class 语法&#xff08;语法糖&#xff09; 二、构造函数与 new 关键字 1. 构造函数的作用 2. 构造函数的特征…...

【langchain4j系列教程-02】Langchain4j调用DeepSeek

文章目录 依赖引入代码示例api key如何获取模型名称及价格为什么调用DeepSeek API用的是OpenAIChatModel 这篇文章主要介绍了如何在Java项目中引入DeepSeek的依赖&#xff0c;并提供了调用DeepSeek API的代码示例。 依赖引入 DeepSeek是一个与OpenAI接口标准兼容的人工智能平台…...

c++STL入门

目录 什么是STL&#xff1f; vector容器 构造函数 赋值操作 vector容量和大小 vector存放内置数据类型 vector存放自定义数据类型 存放指针 vector容器嵌套容器 string容器 构造函数 赋值操作 字符串拼接 查找和替换 string字符串比较 string字符存取 string插…...

公有云子账号认证的原理和步骤

1 为什么使用子账号 1.1 子账号认证的背景 主账号权限过大:公有云账号(主账号)对账号中的资源具有完全管理权限,且无法调整其权限大小,多人共用时无法在审计日志中区分出具体使用人,一旦泄露风险极大且难以追溯。 安全需求:为了提高安全性,避免因主账号信息泄露而导致…...

基于Flask的微博舆情数据分析系统

【Flask】基于Flask的微博舆情数据分析系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统能够高效收集、处理微博上的海量数据&#xff0c;实时反映公众对某些事件或话题的舆论倾向&am…...

Mac OS 禁用 SIP 系统完整性保护

关闭并重新启动 Mac&#xff0c;CommandR在启动时按住以进入Recovery Mode.进入Recovery模式后打开终端 -bash-3.2# csrutil disable Turning off System Integrity Protection reguires modifying system security.Allow booting unsigned operating systems and any ker…...

第十四届蓝桥杯省赛真题解析(含C++详细源码)

第十四届蓝桥杯省赛 整数删除满分思路及代码solution1 &#xff08;40% 双指针暴力枚举&#xff09;solution 2&#xff08;优先队列模拟链表 AC&#xff09; 冶炼金属满分代码及思路 子串简写满分思路及代码solution 1&#xff08;60% 双指针&#xff09;solution 2&#xff0…...

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can...

从扩展黎曼泽塔函数构造物质和时空的结构-16

都是一样的泽塔函数&#xff0c;却呈现出不同的性质&#xff0c;而不同的性质无关于自然数还是质数&#xff0c;完全是由s来决定的。可以猜想&#xff0c; 就是光子&#xff0c;而如果&#xff0c; 就是物质粒子。其中不同的k指出不同的周期或者对应于不同的质数p&#xff0c;虽…...

【C++】list模拟实现

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲STL中list的模拟实现&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C学习笔记 &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C语言入门基础&#xff0c…...

人脸专注度检测系统(课堂专注度检测、人脸检测、注意力检测系统)

人脸专注度检测系统 项目介绍 本项目是基于Flask、MobileNetV2、Mediapipe的人脸专注度检测系统。 项目采用tensorflow.keras库内置的MobileNetV2预训练模型&#xff0c;对自主采集的少量人脸图片数据迁移训练而得到最终的人脸专注度检测模型。 项目采用前后端分离的技术框架…...

文件操作和IO ——Java

初识文件 首先文件分为&#xff1a; 1.狭义的文件 – 保存在硬盘上的文件。 2.广义的文件 – 操作系统进行资源管理的一种机制。很多的软件/硬件资源&#xff0c;抽象成“文件”来进行表示。 &#xff08;println > 控制台&#xff0c;scanner > 控制台的标准输入&#…...

dmsetup 清理ceph osd残留磁盘分区

在物理机上接入磁盘并准备格式化时&#xff0c;发现磁盘中存在之前残留的 Ceph OSD 分区。尝试运用 fdisk 重新分区、重新格式化&#xff0c;以及使用 sgdisk 格式化&#xff0c;甚至重写磁盘头&#xff0c;都未能成功清理掉这些 OSD 残留分区。最终&#xff0c;借助 dmsetup 直…...

每日一题(小白)字符串娱乐篇16

分析题意可以了解到本题要求在一串字符串中找到所有组合起来排序递增的字符串。我们可以默认所有字符在字符串中的上升序列是1&#xff0c;从第一个字符开始找&#xff0c;如果后面的字符大于前面的字符就说明这是一个上序列那么后面字符所在的数组加一&#xff0c;如果连接不上…...

【Mac 从 0 到 1 保姆级配置教程 11】- Mac 基础配置 Finder、触控板、常用快捷键等

文章目录 前言配置 Finder1. 把我们的家目录请出来2. 显示文件扩展名3. 展示隐藏文件4. 显示路径栏和状态栏5. 固定文件夹到工具栏 基础快捷键1. Finder 导航快捷键2. 文件操作快捷键3. 视图和显示快捷键4. 搜索和选择快捷键5. 实用技巧6. 关于文件创建 配置触控板1. 右键设置2…...

Redis 渐进式rehash怎么判定rehash完成了?

Redis 渐进式 Rehash 的完成判断机制 在 Redis 的字典(dict)结构扩容或缩容时,会使用 渐进式 Rehash 来避免一次性迁移所有键值对导致的阻塞。以下是判断旧哈希表(ht[0])是否全部迁移完毕的核心逻辑: 1. 渐进式 Rehash 的核心流程 Redis 的字典结构包含两个哈希表: t…...

Redis的常用数据结构

三. Redis 的常用数据结构 (redis提供的查询功能, 不像mysql这么强大) 1. 认识数据类型和编码方式 常见数据结构 (数据类型) : string (字符串), list (列表), hash (哈希), set (集合), zset (有序集合). Redis 底层在实现上述数据结构的时候, 会在源码层面进行优化, 来达到…...

c++中的虚函数

在C中&#xff0c;虚函数&#xff08;Virtual Function&#xff09;是一种实现多态的重要机制&#xff0c;它允许在派生类中重写基类的函数&#xff0c;从而在运行时根据对象的实际类型调用相应的函数版本。 1. 虚函数的定义 虚函数是在基类中使用关键字virtual声明的函数。例…...

unreal engine5开发仿鬼泣5的游戏,把敌人击飞到空中4连击

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、具体蓝图 前言 unreal engine5开发仿鬼泣5的游戏&#xff0c;把敌人击飞到空中4连击&#xff0c;先看下效果 一、实现思路 unreal engine5开发仿鬼泣5的游戏&#xff0c;把敌人击飞到空中4连击 在Unreal Engi…...

蓝桥杯嵌入式第十四届模拟二(PWM、USART)

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…...

深挖 TypeScript 基础数据类型:应用与陷阱

在 TypeScript 的学习与实践过程中&#xff0c;对基础数据类型的深入理解和正确运用&#xff0c;是写出高质量代码的关键。本篇文章会通过探讨数据类型在实际场景中的应用&#xff0c;分析常见错误&#xff0c;帮助大家提升运用 TypeScript 基础数据类型的能力。​ 一、函数参…...

B站视频教材: Yocto项目实战教程 第一章 PPT讲解

B站视频链接,请多多关注本人B站&#xff1a; &#x1f4cc; Yocto项目实战教程&#xff1a;第一章 视频讲解 在当今嵌入式系统快速发展的背景下&#xff0c;越来越多的设备和行业依赖于高效、可定制、可维护的操作系统解决方案。嵌入式Linux系统&#xff0c;凭借其开源灵活性和…...