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

Spring 事务和事务传播机制(详解)

1 .事务

1.1.什么是事务?

事务是一组操作的集合,是不可分割的操作

事务作为一个整体,要不同时完成,要不同时失败

1.2什么时候需要事务?

     关于金钱的操作基本都会有事务

例如转账操作:

  • 第一步 A账号 - 500元
  • 第二步  B账户+ 500元

如果没有事务,第⼀步执⾏成功了, 第⼆步执⾏失败了, 那么A 账⼾的500 元就平⽩⽆故消失了. 如果使 ⽤事务就可以解决这个问题, 让这⼀组操作要么⼀起成功, 要么⼀起失败

1.3 事务的操作

 事务的操作主要有三步:

  1. 开启事务:start transaction / begin(一组操作前开启事务)
  2. 提交事务:commit (这组操作全部成功,提交事务)
  3. 回滚事务:rollback(这组操作中间任何一个操作出现异常,回滚事务)

2 .Spring 中事务的实现 

spring事务操作分为两类:

  1. 编程式事务(手动写代码操作事务) 
  2. 声明式事务(使用注解自动开启事务和提交事务)

 2.1编程式事务(了解)

Spring ⼿动操作事务和上⾯ MySQL 操作事务类似, 有 3 个重要操作步骤
  1. 开启事务(获取事务)
  2. 提交事务
  3. 回滚事务

SpringBook内置了两个对象:

1.DataSoureTransactionManager 事务管理器,用来获取事务(开启事务),提交和回滚事务的

2. TransactionDefinition 是事务的属性 在获取事务的时候需要将 TransactionDefinition 传递进去从而获取一个事务事务 TransactionStatus

 代码实现:

@RestController
public class UserController {// JDBC 事务管理器@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;// 定义事务属性@Autowiredprivate TransactionDefinition transactionDefinition;@Autowiredprivate UserService userService;@RequestMapping("/registry")public String registry(String name,String password){// 开启事务TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);//⽤⼾注册userService.registryUser(name,password);//提交事务dataSourceTransactionManager.commit(transactionStatus);//回滚事务//dataSourceTransactionManager.rollback(transactionStatus);return "注册成功";}
}    

 以上代码虽然可以实现事务, 但操作也很繁琐, 有没有更简单的实现⽅法呢?

2.2 Spring 声明式事务 @Transactional 

 2.2.1 声明式事务 实现共分为两步:

1.添加依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId>
</dependency>

2.在需要事务的方法上添加@Transactional 即可,无需手动开启事务和提交回滚事务。

进⼊⽅法时⾃动开启事务, ⽅法执⾏完会⾃动提交事务, 如果中途发⽣了没有处理的异常会⾃动 回滚事务.
@RequestMapping("/trans")
@RestController
public class TransactionalController {@Autowiredprivate UserService userService;@Transactional@RequestMapping("/registry")public String registry(String name,String password){//⽤⼾注册userService.registryUser(name,password);return "注册成功";}
}

 2.2.2 @Transactional 作⽤范围

  • 修饰方法时:只有修饰public方法时才会生效 
  • 修饰类时:对@Transactional修饰的类中所有的public方法都生效
⽅法/类被 @Transactional 注解修饰时, 在⽬标⽅法执⾏开始之前, 会⾃动开启事务, ⽅法执⾏结束之后, ⾃动提交事务.
如果在⽅法执⾏过程中, 出现异常, 且异常未被捕获, 就进⾏事务回滚操作.
如果异常被程序捕获, ⽅法就被认为是成功执⾏, 依然会提交事务

 2.2.3  @Transactional 在异常被捕获不会进⾏事务⾃动回滚

实例:

@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){//⽤⼾注册userService.registryUser(name,password);log.info("⽤⼾数据插⼊成功");//对异常进⾏捕获try {//强制程序抛出异常int a = 10/0;}catch (Exception e){e.printStackTrace();}return "注册成功";
}

 运⾏程序, 发现虽然程序出错了, 但是由于异常被捕获了, 所以事务依然得到了提交.

如果需要事务进⾏回滚, 有以下两种⽅式

 方法一 重新抛出异常:

@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){//⽤⼾注册userService.registryUser(name,password);log.info("⽤⼾数据插⼊成功");//对异常进⾏捕获try {//强制程序抛出异常int a = 10/0;}catch (Exception e){//将异常重新抛出去throw e;}return "注册成功";
}

 方法二 手动回滚事务:

使⽤ TransactionAspectSupport.currentTransactionStatus() 得到当前的事务, 并
使⽤ setRollbackOnly 设置 setRollbackOnly
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){//⽤⼾注册userService.registryUser(name,password);log.info("⽤⼾数据插⼊成功");//对异常进⾏捕获try {//强制程序抛出异常int a = 10/0;}catch (Exception e){// ⼿动回滚事务TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}return "注册成功";
}

3. @Transactional 详解

@Transactional 注解的使用细节(三个常见属性):

  1. rollbackFor:异常回滚属性,指定触发回滚事务的异常类型,也可以指定多个异常类型
  2. lsolation:事务的隔离级别,默认值为Isolation.DEFAULT
  3. propagation:事务的传播机制,默认值为Propagation.REQUIRED

rollbackFor (详解)

@Transactional 默认只在遇到运⾏时异常Error时才会回滚, ⾮运⾏时异常不回滚. 即Exception的⼦类中, 除了RuntimeException及其⼦类

 

但是如果我们需要所有异常都回滚, 需要来配置 @Transactional 注解当中的 rollbackFor 属性, 通
rollbackFor 这个属性指定出现何种异常类型时事务进⾏回滚

小结:

  1. 在Spring的事务管理中,默认只在遇到运⾏时异常RuntimeException和Error时才会回滚
  2.  如果需要回滚指定类型的异常, 可以通过rollbackFor属性来指定.

4. 事务的隔离级别

 Mysql 事务隔离级别 ,SQL 标准定义了四种隔离级别, MySQL 全都⽀持.

这四种隔离级别分别是:

  1. 读未提交(READ UNCOMMITTED): 读未提交, 也叫未提交读. 该隔离级别的事务可以看到其他事务中未提交的数据        
     因为其他事务未提交的数据可能会发⽣回滚, 但是该隔离级别却可以读到, 我们把该级别读到的数 据称之为脏数据, 这个问题称之为 脏读 .
  2. 读提交(READ COMMITTED): 读已提交, 也叫提交读. 该隔离级别的事务能读取到已经提交事务的数据        
    该隔离级别不会有脏读的问题.但由于在事务的执⾏中可以读取到其他事务提交的结果, 所以在不同时间的相同 SQL 查询可能会得到不同的结果, 这种现象叫做不可重复读
  3. 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别.  
    ⽐如此级别的事务正在执⾏时, 另⼀个事务成功的插⼊了某条数据, 但因为它每次查询的结果都是 ⼀样的, 所以会导致查询不到这条数据, ⾃⼰重复插⼊时⼜失败(因为唯⼀约束的原因). 明明在事务 中查询不到这条信息,但⾃⼰就是插⼊不进去, 这个现象叫 幻读
  4. 串⾏化(SERIALIZABLE): 序列化, 事务最⾼隔离级别. 它会强制事务排序, 使之不会发⽣冲突, 从⽽解 决了脏读, 不可重复读和幻读问题, 但因为执⾏效率低, 所以真正使⽤的场景并不多

 Spring 事务隔离级别:

Spring中隔离级别有五种:

  1. Isolation.DEFAULT:以连接的数据库的事务隔离级别为主
  2. Isolation.READ_UNCOMMITTED:读未提交,对应SQL标准中READ UNCOMMITTED
  3. Isolation.READ_COMMITTED:读已提交,对应SQL标准中READCOMMITTED
  4. solation.REPEATABLE_READ:可重复读,对应SQL标准中REPEATABLE READ
  5. Isolation.SERIALIZABLE :串行化:对应SQL标准中 SERIALIZABLE

 Spring 中事务隔离级别可以通过 @Transactional 中的 isolation 属性进⾏设置

@Transactional(isolation = Isolation.READ_COMMITTED)
@RequestMapping("/registry")
public String registry(String name,String password){.....略
}

5 Spring事务传播机制

5.1什么是事务传播机制

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的

 5.2事务传播机制的作用

事务传播机制是保证⼀个事务在多 个调⽤⽅法间的可控性的(稳定性的)

事务的传播机制有哪些

5.3事务的传播机制有哪些 

@Transactional 注解 可以通过 propagation属性来指定传播行为

Spring 事务传播机制有以下7种:

  1. opagation.REQUIRED:默认的事务传播级别.如果当前存在事务,则加入该事务.如果当前没有事务,则创建一个新的事务
  2. opagation.SUPPORTS:如果当前存在事务,则加入该事务.如果当前没有事务,则以非事务的方式继续运行
  3. opagation.MANDAToRY:强制性.如果当前存在事务,则加入该事务.如果当前没有事务,则抛出异常
  4. opagation.REQUIRES_NEW:创建一个新的事务.如果当前存在事务,则把当前事务挂起.也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰
  5. ropagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起不用
  6. ropagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常.
  7. opagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行.如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED

5.4Spring 事务传播机制使⽤ 

上面7种传播机制 重点关心 两个就可以了:

  1. REQUIRED(默认情况下就是这个)
  2. REQUIRES_NEW

5.4.1 REQUIRED (加入事务)

默认的事务传播级别.如果当前存在事务,则加入该事务.如果当前没有事务,则创建一个新的事务

代码实现:

@RequestMapping("/user")
@RestController
@Slf4j
public class TransController {@Autowiredprivate UserService userService;@Autowiredprivate LogService logService;@Transactional(propagation = Propagation.REQUIRED)@RequestMapping("/insert")public boolean UserInsert(UserInfo userInfo) {Integer n = userService.insert();Integer m = logService.insert();log.info("插入成功");if(n>0 || m>0){System.out.println("插入成功");return  true;}return  false;}
}

在对应的userService和LogService 都添加上:

@Transactional(propagation = Propagation.REQUIRES)

 LogService代码:

@Service
public class LogService {@Autowiredprivate LogMapper logMapper;@Transactional(propagation = Propagation.REQUIRED)public Integer insert() {LogInfo logInfo = new LogInfo();logInfo.setUserName("用户2");logInfo.setOp("添加2");Integer n = logMapper.insertLog(logInfo);int a =10/0;if(n>0){return  n;}return 0;}
}

 userService代码:

@Service
public class UserService {@AutowiredUserMapper userMapper;@Transactional(propagation = Propagation.REQUIRED)public Integer insert() {UserInfo userInfo = new UserInfo();userInfo.setUserName("zhangsan");userInfo.setPassword("1234");Integer n = userMapper.insertUser(userInfo);if(n>0){return  n;}return 0;}
}
运⾏程序, 发现数据库没有插⼊任何数据
流程描述:
  1.  UserInsert 方法开启事务
  2. 用户注册,插入一条数据 (执行成功) (和 UserInsert 使用同一个事务)
  3. 插入一条数据 出现异常,执行失败 (和 UserInsert 使用同一个事务)
  4. 因为步骤三出现异常,导致事务回滚,步骤2和步骤3使用同一个事务,导致步骤2的数据也需要回滚

 5.4.2 EQUIRES_NEW (新建事务)

将上述UserService和LogService中相关方法事务传播机制改为

Propagation.REQUIRES_NEw

创建一个新的事务.如果当前存在事务,则把当前事务挂起.也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰 

 UserMapper代码:

@Service
public class UserService {@AutowiredUserMapper userMapper;@Transactional(propagation = Propagation.REQUIRES_NEW)public Integer insert() {UserInfo userInfo = new UserInfo();userInfo.setUserName("zhangsan");userInfo.setPassword("1234");Integer n = userMapper.insertUser(userInfo);if(n>0){return  n;}return 0;}
}

LogService代码:

@Service
public class LogService {@Autowiredprivate LogMapper logMapper;@Transactional(propagation = Propagation.REQUIRES_NEW)public Integer insert() {LogInfo logInfo = new LogInfo();logInfo.setUserName("用户2");logInfo.setOp("添加2");Integer n = logMapper.insertLog(logInfo);int a =10/0;if(n>0){return  n;}return 0;}
}

 运行结果:

运行程序,发现用户数据插入成功了,日志表数据插入失败,

LogService方法中的事务不影响UserService中的事务

当我们不希望事务之间相互影响时,可以使用该传播行为

总结: 

  1. Spring中使用事务,有两种方式:编程式事务(手动操作)和声明式事务.其中声明式事务使用较多,在方法上添加@Transactional就可以实现了
  2. 通过 @Transactional(isolation=Isolation.SERIALIZABLE)设置事务的隔离级别.Spring 中的事务隔离级别有 5种
  3. 通过 @Transactional(propagation = Propagation.REQUIRED) 设置事务的传播机制, Spring 中的事务传播级别有7种,重点关注 REQUIRED(默认值)REQUIRES_NEW

相关文章:

Spring 事务和事务传播机制(详解)

1 .事务 1.1.什么是事务&#xff1f; 事务是一组操作的集合,是不可分割的操作 事务作为一个整体&#xff0c;要不同时完成&#xff0c;要不同时失败 1.2什么时候需要事务&#xff1f; 关于金钱的操作基本都会有事务 例如转账操作&#xff1a; 第一步 A账号 - 500元第二步 B账…...

Innodb MVCC实现原理

什么是MVCC? MVCC全称多版本并发控制&#xff0c;是在并发访问数据库时对操作数据做多版本管理&#xff0c;避免因为写数据时要加写锁而阻塞读取数据的请求问题。 Innodb对mvcc的实现 1、事务版本号 每次事务开启前都会从数据库获得一个自增长的事务ID&#xff0c;可以从事…...

【网络编程】网络套接字和使用案例

一、为什么大多数网络编程使用套接字 在网络编程中&#xff0c;套接字 (socket) 是最常用的接口&#xff0c;但并不是所有的底层通信都依赖于套接字。尽管如此&#xff0c;绝大多数网络应用&#xff08;特别是在操作系统层面&#xff09;都使用套接字进行通信&#xff0c;因为…...

【Java企业生态系统的演进】从单体J2EE到云原生微服务

Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进&#xff1a;从原始Java到Spring Cloud2.1 原始Java阶段&#xff08;1995-1999&#xff09;2.2 J2EE阶段&#x…...

【爬虫基础】第二部分 爬虫基础理论 P1/3

上节内容回顾&#xff1a;【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 爬虫相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff…...

第2章_保护您的第一个应用程序

第2章_保护您的第一个应用程序 在本章中&#xff0c;您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣&#xff0c;您将运行的示例应用程序由两部分组成&#xff0c;前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证&#xff0…...

山东大学软件学院人工智能导论实验之知识库推理

目录 实验目的&#xff1a; 实验代码&#xff1a; 实验内容&#xff1a; 实验结果 实验目的&#xff1a; 输入相应的条件&#xff0c;根据知识库推理得出相应的知识。 实验代码&#xff1a; def find_data(input_process_data_list):for epoch, data_process in enumerat…...

Java 网络协议面试题答案整理,最新面试题

TCP和UDP的主要区别是什么&#xff1f; TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;的主要区别在于TCP是面向连接的协议&#xff0c;而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。 1、连接…...

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后&#xff0c;安装的时候没选择其他硬盘&#xff0c;虚拟磁盘也在c盘会占用很大的空间&#xff0c;像我的就三十多个G&#xff0c;把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...

AOP进阶-02.通知顺序

一.通知顺序 当有多个切面类中的切入点表达式一样时&#xff0c;这些切面类的执行顺序是怎样的呢&#xff1f;如图我们将定义两个切面类&#xff0c;一个MyAspect2&#xff0c;一个MyAspect3&#xff0c;一个MyAspect4。执行后我们发现&#xff0c; 对于目标方法前的通知方法&…...

${sym} 与 String(sym) 的区别

在 JavaScript 中&#xff0c;${sym}&#xff08;模板字符串插值&#xff09;和 String(sym)&#xff08;显式类型转换&#xff09;虽然都涉及将值转换为字符串&#xff0c;但它们的底层逻辑和行为存在显著差异&#xff0c;尤其是在处理 Symbol 等特殊类型时。以下是具体对比&a…...

sglang框架源码笔记

文章目录 整体架构1. **客户端&#xff08;Client&#xff09;**&#xff1a;2. **服务器端&#xff08;Server&#xff09;**&#xff1a;3. **调度器与模型工作节点&#xff08;Scheduler & Model Worker&#xff09;**&#xff1a; TpModelWorker类ModelRunner类TpModel…...

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法&#xff08;Chaotic Evolution Optimization, CEO&#xff09;是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…...

uake 网络安全 reverse网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文首发于“合天网安实验室” 首先从PEID的算法分析插件来介绍&#xff0c;要知道不管是在CTF竞赛的REVERSE题目中&#xff0c;还是在实际的商业产品中&#xf…...

C语言实现单链表

单链表是数据结构中最基础的链式结构,它不按照线性的顺序存储数据,而是由若干个同一结构类型的“节点”依次串联而成的,即每一个节点里保存着下一个节点的地址(指针)。 上图中,一个表头变量head是用来存储链表首节点的地址,链表中每个节点有data(数据)部分和n…...

Rk3568驱动开发_点亮led灯代码完善(手动挡)_6

1.实现思路&#xff1a; 应用层打开设备后通过write函数向内核中写值&#xff0c;1代表要打开灯&#xff0c;0代表要关闭灯 Linux配置gpio和控制gpio多了一个虚拟内存映射操作 2.注意事项&#xff1a; 配置和读写操作的时候要谨慎&#xff0c;比如先关掉gpio再注销掉虚拟内存…...

threejs:document.createElement创建标签后css设置失效

vue3threejs&#xff0c;做一个给模型批量CSS2D标签的案例&#xff0c;在导入模型的js文件里&#xff0c;跟着课程写的代码如下&#xff1a; import * as THREE from three; // 引入gltf模型加载库GLTFLoader.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.…...

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…...

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通过编写提示词&#xff0c;辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多&#xff0c;流量分析的需求多种多样&#xff0c;…...

Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合

概述 实时目标检测对于许多实际应用来说已经变得至关重要&#xff0c;而Ultralytics公司开发的YOLO&#xff08;You Only Look Once&#xff0c;只看一次&#xff09;系列一直是最先进的模型系列&#xff0c;在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...

一个行为类似标准库find算法的模板

函数需要两个模板类型参数&#xff0c;一个表示函数的迭代器参数&#xff0c;另一个表示值的类型。 代码 #include<iostream> #include<string> #include<vector> #include<list>using namespace std;template <typename IterType,typename T>…...

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…...

Elasticsearch 的分布式架构原理:通俗易懂版

Elasticsearch 的分布式架构原理&#xff1a;通俗易懂版 Lucene 和 Elasticsearch 的前世今生 Lucene 是一个功能强大的搜索库&#xff0c;提供了高效的全文检索能力。然而&#xff0c;直接基于 Lucene 开发非常复杂&#xff0c;即使是简单的功能也需要编写大量的 Java 代码&…...

[深度学习]基于C++和onnxruntime部署yolov12的onnx模型

基于C和ONNX Runtime部署YOLOv12的ONNX模型&#xff0c;可以遵循以下步骤&#xff1a; 准备环境&#xff1a;首先&#xff0c;确保已经下载后指定版本opencv和onnruntime的C库。 模型转换&#xff1a; 安装好yolov12环境并将YOLOv12模型转换为ONNX格式。这通常涉及使用深度学习…...

seacmsv9报错注入

1、seacms的介绍 ​ seacms中文名&#xff1a;海洋影视管理系统。是一个采用了php5mysql架构的影视网站框架&#xff0c;因此&#xff0c;如果该框架有漏洞&#xff0c;那使用了该框架的各个网站都会有相同问题。 2、源码的分析 漏洞的部分源码如下&#xff1a; <?php …...

剑指 Offer II 033. 变位词组

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20033.%20%E5%8F%98%E4%BD%8D%E8%AF%8D%E7%BB%84/README.md 剑指 Offer II 033. 变位词组 题目描述 给定一个字符串数组 strs &#xff0c;将 变位词 组合在一起…...

【2025全网最新最全】前端Vue3框架的搭建及工程目录详解

文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/ 安装完成后&#xff0c;打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…...

前缀和专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》

目录 一、0求和 - 蓝桥云课 算法代码&#xff1a; 代码思路概述 代码详细解释 数组定义 输入读取 前缀和计算部分 结果计算部分 输出结果 程序结束 总结 二、1.可获得的最小取值 - 蓝桥云课 算法代码&#xff1a; 代码思路概述 详细代码逻辑解释 输入初始化 …...

1.测试策略与计划设计指南

1.介绍 1.1项目介绍 完整项目组成&#xff1a;1.基于K8S定制开发的SaaS平台&#xff1b;2.多个团队提供的中台服务(微服务)&#xff1b;3.多个业务团队开发的系统平台。涉及多个项目团队、上百个微服务组件。 测试在所有团队开发测试后&#xff0c;自己搭建测试环境&#xff0c…...

pikachu

暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程&#xff08;非常详细&#xff09;零基础入门到精通&#xff0c;看一篇就够了&#xff01;让你挖洞事半功倍&#xff01;_burpsuite使用教程-CSDN博客 登录页面&#xff0c;随意输入抓包&#xff0c;发送到攻击…...

HDFS扩缩容及数据迁移

1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理&#xff0c;决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表&#xff0c;这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...

设计模式-(状态模式,策略模式,代理模式,责任链模式)

状态模式 概念&#xff1a; 用于管理一个对象在不同状态下的行为变化。它允许对象在内部状态改变时改变其行为&#xff0c;从而让对象看起来像是改变了其类。状态模式的核心思想是将状态封装到独立的类中&#xff0c;每个状态类都定义了在该状态下对象的行为 状态模式主要涉…...

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…...

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中&#xff0c;使用合适的工具和插件可以极大地提高我们的工作效率。今天&#xff0c;我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件&#xff0c;这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者&#xff0c;本文都将为你提供…...

每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理

引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…...

qt-C++笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试

qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试 code review! 文章目录 qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试1.Application(Qt):Qt Widgets Application1.1.qmake版本1.2.cmake版本 2.Application(Qt):Qt Console Applicati…...

【NestJS系列】安装官方nestjs CLI 工具

环境搭建指南:从零开始创建 NestJS 项目 一、工具准备 1. 安装 Node.js 环境 推荐使用 LTS 版本(目前 20.x 以上)验证安装:终端执行 node -v 和 npm -vNode.js 官网下载2. 包管理器选择 这里选用更高效的 pnpm,你也可选择 npm 或 yarn # 安装 pnpm npm install -g pnp…...

【Springboot知识】Logback从1.2.x升级到1.3.x需要注意哪些点?

文章目录 **1. 确认依赖版本**示例依赖配置&#xff08;Maven&#xff09;&#xff1a; **2. 处理 StaticLoggerBinder 的移除**解决方案&#xff1a; **3. 修改日志配置文件**示例 logback.xml 配置&#xff1a; **4. 检查兼容性问题**Spring Boot 2.x 的兼容性解决方案&#…...

【Linux C | 时间】localtime 的介绍、死机、死锁问题以及 localtime_r 函数的时区问题

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

每日一题——LRU缓存机制的C语言实现详解

LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...

虚函数表和虚函数表指针

1.虚函数表什么时候生成&#xff1f; 编译器编译的时候生成 2.虚函数表存放在哪里&#xff1f; 讨论两种情况&#xff1a;在磁盘&#xff08;可执行程序&#xff09;、在内存&#xff08;运行状态&#xff09; 3.虚函数表与虚函数表指针的关系 每个类只有一个虚函数&#x…...

计算机毕业设计SpringBoot+Vue.js图书进销存管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理

大白话Vuex 核心概念&#xff08;state、mutations、actions&#xff09;的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具&#xff0c;就好像是一个大管家&#xff0c;帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…...

【学写LibreCAD】1 LibreCAD主程序

一、源码 头文件&#xff1a; #ifndef MAIN_H #define MAIN_H#include<QStringList>#define STR(x) #x #define XSTR(x) STR(x)/*** brief handleArgs* param argc cli argument counter from main()* param argv cli arguments from main()* param argClean a list…...

CentOS7最小化安装中使用curl安装yum和wget

在 CentOS 7 最小化安装中&#xff0c;如果已经有curl工具&#xff0c;可以按照以下步骤使用它来安装yum和wget&#xff1a; 1. 备份原有的 yum 源配置文件 为了避免配置冲突或后续需要恢复&#xff0c;先备份原有的yum源配置文件。 mv /etc/yum.repos.d/CentOS-Base.repo /…...

【Linux】learning notes(3)make、copy、move、remove

文章目录 1、mkdir &#xff08;make directory&#xff09;2、rmdir &#xff08;remove directory&#xff09;3、rm&#xff08;remove&#xff09;4、>5、touch 新建文件6、mv&#xff08;move&#xff09;7、cp&#xff08;copy&#xff09; 1、mkdir &#xff08;make…...

P10108 [GESP202312 六级] 闯关游戏

题目大意 如题 分析 设最佳通关方案为 { s 1 , s 2 , . . . , s k } \{s_1,s_2,...,s_k\} {s1​,s2​,...,sk​}&#xff0c;其中 s i s_i si​ 代表第 i i i 次到达的关卡&#xff08; ≥ N \ge N ≥N 的不算&#xff09;。 当 a k N − 1 a_kN-1 ak​N−1 时&#…...

Dubbo RPC 原理

一、Dubbo 简介 Apache Dubbo 是一款高性能、轻量级的开源 RPC 框架&#xff0c;支持服务治理、协议扩展、负载均衡、容错机制等核心功能&#xff0c;广泛应用于微服务架构。其核心目标是解决分布式服务之间的高效通信与服务治理问题。 二、Dubbo 架构设计 1. 核心组件 Prov…...