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

【spring 事务】事务的基本使用,事务隔离级别、事务传播机制

在Spring框架中,声明式事务管理是一种通过注解或配置文件自动管理事务的方式,而不需要手动编写事务管理代码。@Transactional是Spring提供的一个注解,用于声明式事务管理,它使得事务的管理变得简单而清晰。

主要特性

  1. 自动事务管理:使用@Transactional注解时,Spring会自动为相关方法开启、提交和回滚事务。
  2. 事务的传播行为:Spring事务支持多种传播行为,控制方法之间如何共享事务。例如:REQUIRED(默认值),REQUIRES_NEWNESTED等。
  3. 事务的隔离级别:Spring事务支持多种隔离级别,如READ_COMMITTEDREAD_UNCOMMITTEDSERIALIZABLE等,用于定义不同事务之间的隔离程度。
  4. 事务的回滚规则:可以配置在发生哪些异常时进行回滚,默认情况下,Spring只会对RuntimeExceptionError进行回滚。
  5. 事务超时:可以设置事务的超时时间,超时后自动回滚。

使用方式

添加依赖

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

@Transactional可以用在类或方法上:

  • 类级别:在类上使用时,所有方法都会参与事务。
  • 方法级别:在方法上使用时,只有该方法会参与事务。
示例代码:
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;@Service
public class AccountService {@Transactionalpublic void transferMoney(Account fromAccount, Account toAccount, double amount) {// 执行转账操作fromAccount.withdraw(amount);toAccount.deposit(amount);}
}
  • ⽅法/类被 @Transactional 注解修饰时, 在⽬标⽅法执⾏开始之前, 会⾃动开启事务, ⽅法执⾏结束之后, ⾃动提交事务.
  • 如果在⽅法执⾏过程中, 出现异常, 且异常未被捕获, 就进⾏事务回滚操作.
  • 如果异常被程序捕获, ⽅法就被认为是成功执⾏, 依然会提交事务.

手动回滚事务

TransactionAspectSupport 是 Spring AOP 事务支持的一个类,它提供了对当前事务状态的访问。通过 currentTransactionStatus() 获取当前事务的状态,并调用 setRollbackOnly() 方法标记事务为回滚状态,从而在事务提交时强制回滚。

使用场景

通常在业务逻辑中,如果发生某些特定的异常或需要根据业务条件回滚事务时,可以手动调用 setRollbackOnly(),这样Spring会在事务提交时回滚事务。

示例代码

假设你有一个业务服务,想根据某些条件决定是否回滚事务:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;@Service
public class AccountService {@Transactionalpublic void transferMoney(Account fromAccount, Account toAccount, double amount) {// 执行转账操作fromAccount.withdraw(amount);toAccount.deposit(amount);// 根据业务逻辑判断是否回滚事务if (amount < 0) {// 如果金额小于0,手动回滚事务TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}}
}

解释

  1. @Transactional 注解标注了整个方法,表示方法中的操作都在一个事务中执行。
  2. 在方法内部,如果发现金额小于0,就调用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 来标记事务为回滚状态。
  3. 当事务提交时,Spring会发现事务标记为回滚状态,并会自动回滚事务。

在Spring的@Transactional注解中,isolation属性用于定义事务的隔离级别。事务的隔离级别决定了一个事务内的操作对其他并发事务的可见性,以及其他事务的操作对当前事务的影响。通过设置适当的隔离级别,可以有效地控制并发事务对数据的一致性和完整性所带来的影响。

事务隔离级别

数据库的事务隔离级别通常定义了一个事务内操作的数据在提交之前是否对其他事务可见。事务隔离级别越高,系统的并发性可能会越低,但数据一致性和安全性会更高。常见的事务隔离级别有四种,它们的定义如下:

  1. READ_UNCOMMITTED(读取未提交):
    • 允许事务读取其他事务未提交的数据。
    • 可能会导致脏读(Dirty Read),即一个事务读取到另一个事务尚未提交的脏数据。
    • 最低的隔离级别,对并发性能有较少影响,但会导致数据不一致。
  2. READ_COMMITTED(读取已提交):
    • 只允许读取其他事务已提交的数据。
    • 可以避免脏读,但是可能会出现不可重复读(Non-repeatable Read),即在同一个事务内,如果读取相同数据,可能会得到不同的结果,因为其他事务可能已修改了数据。
    • 是大多数数据库的默认隔离级别。
  3. REPEATABLE_READ(可重复读取):
    • 保证事务内读取的数据在事务执行期间不会被其他事务修改。
    • 避免了脏读和不可重复读,但可能会导致幻读(Phantom Read),即事务内的查询结果在执行过程中可能会因为其他事务的插入操作而发生变化。
  4. SERIALIZABLE(串行化):
    • 是最高的隔离级别,所有事务按顺序执行,模拟为串行执行。
    • 事务之间完全隔离,可以避免脏读、不可重复读和幻读。
    • 由于严格的隔离性,会显著降低并发性,可能导致性能瓶颈。

Spring 中的 @Transactional isolation 属性

在Spring的@Transactional注解中,isolation属性允许你指定事务的隔离级别。它的默认值通常是Isolation.DEFAULT,表示使用底层数据库的默认隔离级别。如果你希望显式指定某个隔离级别,可以使用以下选项:

import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Isolation;@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {// 业务逻辑
}

Spring 提供的隔离级别选项

  • Isolation.DEFAULT:使用底层数据库的默认隔离级别,通常是READ_COMMITTED
  • Isolation.READ_UNCOMMITTED:读取未提交的事务数据,可能会导致脏读。
  • Isolation.READ_COMMITTED:读取已提交的数据,可以防止脏读。
  • Isolation.REPEATABLE_READ:可重复读取,防止脏读和不可重复读。
  • Isolation.SERIALIZABLE:串行化,事务完全隔离,防止脏读、不可重复读和幻读。

示例

假设你有一个银行转账业务,需要确保转账过程中的一致性。你可以使用@Transactional注解来定义事务的隔离级别,确保在高并发环境下的事务隔离性。

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;public class BankService {@Transactional(isolation = Isolation.READ_COMMITTED)public void transferMoney(Account fromAccount, Account toAccount, double amount) {// 从fromAccount账户中扣款fromAccount.withdraw(amount);// 向toAccount账户中存款toAccount.deposit(amount);}
}

在上述代码中,@Transactional注解使用了READ_COMMITTED隔离级别,确保在转账过程中,fromAccounttoAccount的余额在事务提交之前是不可见的。

隔离级别的影响

  • 性能:较低的隔离级别(如READ_UNCOMMITTED)会提高并发性,但可能会引发脏读、不可重复读等问题。而较高的隔离级别(如SERIALIZABLE)则会降低并发性,但保证数据的一致性。
  • 一致性:较高的隔离级别可以保证更高的数据一致性,避免脏读、不可重复读和幻读。但代价是性能会受影响。

事务传播机制

在Spring的@Transactional注解中,propagation属性用于定义事务的传播行为,决定了一个事务方法在调用另一个事务方法时,事务如何传播。事务传播机制影响一个方法调用另一个方法时如何参与事务,决定了是加入现有事务、创建新事务还是不参与事务等行为。

常见的事务传播行为

Propagation.REQUIRED(默认传播行为):

  • 如果当前没有事务存在,则新建一个事务;如果当前存在事务,则加入到现有事务中。
  • 这是最常用的传播行为,也是默认行为。通常情况下,如果没有明确的需求,推荐使用此传播行为。

示例

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {// 如果没有事务,启动一个新的事务;如果已经有事务,加入当前事务
}

Propagation.SUPPORTS

  • 如果当前存在事务,则加入到事务中;如果没有事务,则以非事务的方式执行。
  • 当调用方法时,如果存在事务,方法会在事务内执行;如果没有事务,方法不会参与事务。

示例

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {// 如果没有事务,非事务执行;如果有事务,加入当前事务
}

Propagation.MANDATORY

  • 如果当前没有事务,则抛出异常;如果当前存在事务,则加入到现有事务中。
  • 强制要求方法必须在一个事务中运行。如果没有事务存在,Spring会抛出IllegalTransactionStateException异常。

示例

@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {// 必须有一个已经存在的事务,如果没有事务,会抛出异常
}

Propagation.REQUIRES_NEW

  • 无论当前是否存在事务,都会创建一个新的事务;如果当前存在事务,则将当前事务挂起,直到新的事务提交或回滚后恢复。
  • 适用于需要独立运行的事务,确保方法执行时有一个新的事务与当前事务分离。

示例

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {// 创建一个新的事务,挂起当前事务,提交后再恢复当前事务
}

Propagation.NOT_SUPPORTED

  • 如果当前存在事务,则挂起当前事务,并以非事务的方式执行方法;如果没有事务,方法则以非事务的方式执行。
  • 适用于需要禁用事务的场景,无论当前是否有事务,都不使用事务。

示例

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {// 不使用事务,无论当前是否有事务
}

Propagation.NEVER

  • 如果当前存在事务,则抛出异常;如果没有事务,则以非事务的方式执行。
  • MANDATORY类似,但NEVER明确要求方法不在事务中执行。如果当前有事务,Spring会抛出IllegalTransactionStateException异常。

示例

@Transactional(propagation = Propagation.NEVER)
public void methodF() {// 如果当前有事务,则抛出异常;没有事务时,以非事务方式执行
}

Propagation.NESTED

  • 如果当前存在事务,则在当前事务内创建一个嵌套事务;如果没有事务,则与REQUIRED类似,创建一个新的事务。
  • 嵌套事务是通过保存点实现的,如果外部事务回滚,嵌套事务也会回滚。否则,嵌套事务可以独立提交。

示例

@Transactional(propagation = Propagation.NESTED)
public void methodG() {// 如果存在事务,创建一个嵌套事务;如果没有事务,创建一个新的事务
}

传播行为总结

传播行为描述
REQUIRED默认行为,存在事务时加入事务;不存在时创建新事务。
SUPPORTS如果存在事务,则加入事务;如果不存在事务,则不使用事务。
MANDATORY必须有事务,若无事务则抛出异常。
REQUIRES_NEW创建一个新事务,挂起当前事务。
NOT_SUPPORTED不使用事务,挂起当前事务(如果存在)。
NEVER不在事务中执行,若存在事务则抛出异常。
NESTED如果存在事务,则创建一个嵌套事务;否则创建一个新事务。

示例:事务传播行为的使用

假设你有两个方法methodAmethodB,你希望methodA执行时可以自动加入现有事务,而methodB则需要每次都新建事务,即使methodA已经有事务存在。

import org.springframework.transaction.annotation.Transactional;public class TransactionService {@Transactional(propagation = Propagation.REQUIRED)public void methodA() {// 这个方法如果没有事务,会创建新事务,如果有事务,会加入现有事务}@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB() {// 这个方法总是会创建新的事务,挂起当前事务}
}

在这个例子中:

  • 当你调用methodA时,它会尝试使用已有的事务,或者如果没有事务会启动新的事务。
  • 调用methodB时,无论methodA是否在事务中执行,methodB都会启动一个新的事务,并挂起methodA的事务。

相关文章:

【spring 事务】事务的基本使用,事务隔离级别、事务传播机制

在Spring框架中&#xff0c;声明式事务管理是一种通过注解或配置文件自动管理事务的方式&#xff0c;而不需要手动编写事务管理代码。Transactional是Spring提供的一个注解&#xff0c;用于声明式事务管理&#xff0c;它使得事务的管理变得简单而清晰。 主要特性 自动事务管理…...

arkime 和elasticsearch安装方法二

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置&#xff0c;覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…...

GitCode 助力 AutoTable:共创 MyBatis 生态的自动表格管理新篇章

项目仓库https://gitcode.com/dromara/auto-table 解放双手&#xff0c;专注业务&#xff1a;MyBatis 生态的“自动表格”创新 AutoTable 是一款致力于为 MyBatis 生态赋予“自动表格”功能的创新插件。其核心理念是通过 Java 实体类自动生成和维护数据库的表结构&#xff0c…...

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…...

ue5 制作,播放,停止动画蒙太奇

右键&#xff0c;动画蒙太奇 新建插槽 把默认插槽选择为&#xff0c;自己新建的插槽 然后拖一个动画进去 input换成玩家0 就可以接收键盘事件 pawn 自动控制玩家换成玩家0 找到动画蓝图 把它化成我们那边蒙太奇里面的槽 第三步&#xff1a;第三人称角色蓝图 按下F…...

Genetic Prompt Search via Exploiting Language Model Probabilities

题目 利用语言模型概率的遗传提示搜索 论文地址&#xff1a;https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址&#xff1a;https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力&#xff0c;尤其是在诸如fewshot学习…...

mysql之表的外键约束

MySQL表的外键约束详细介绍及代码示例 外键约束是数据库中用于维护数据完整性和一致性的重要机制。它确保一个表中的数据与另一个表中的数据相关联&#xff0c;防止无效的数据引用。本文将详细介绍了外键约束的各个方面&#xff0c;并通过具体的代码示例进行演示。 1. 外键约束…...

linux环境变量配置文件区别 /etc/profile和~/.bash_profile

在 Linux 系统中&#xff0c;环境变量可以定义用户会话的行为&#xff0c;而这些变量的加载和配置通常涉及多个文件&#xff0c;如 ~/.bash_profile 和 /etc/profile。这些文件的作用和加载时机各有不同。以下是对它们的详细区别和用途的说明&#xff1a; 文章目录 1. 环境变量…...

C++----STL(vector)

vector的介绍 vector的文档介绍&#xff1a;cplusplus.com/reference/vector/vector/ 1.基本概念 简单来说&#xff0c;vector是表示可以改变大小的数组的顺序容器。使用连续的存储位置来存储元素&#xff0c;因此可以通过常规指针的偏移量来高效访问。 2.内部机制 vector…...

springboot项目适配电科金仓数据库

又接到了信创适配任务,话不多说,直接开始干货 首先安装一下电科金仓的数据库,直接官网下,对应的授权也下90天的专业版,客户肯定是整个采购,365天的开发版本连接数有限制 KES相关下载地址:电科金仓-成为世界卓越的数据库产品与服务提供商 安装就不做赘述了 启动数据库…...

C# 动态创建Label和ComboBox控件并修改Text获取Text

背景&#xff1a;在做项目的时候可能需要根据一定数量创建某些控件并修改其属性&#xff0c;本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; …...

HP 笔记本重新安装 Windows 11 无法启动

相信你搜到这篇文章的时候&#xff0c; 你已经看过了网上各种关于如何在 HP 笔记本电脑上安装 Windows 11 的文章。你遇到的问题肯定不是网上那些文章讲的那么简单的问题。你遇到的一定不是你不懂如何安装 Windows&#xff0c;不懂如何对硬盘分区等等小白问题。 问题描述 问…...

BUUCTF_Web( XSS COURSE 1)xss

XSS即跨站脚本攻击&#xff08;Cross-Site Scripting&#xff09;&#xff0c;是一种常见的网络安全漏洞. 定义 XSS攻击指攻击者在目标网站中注入恶意脚本&#xff0c;当用户访问该网站时&#xff0c;浏览器会执行这些恶意脚本&#xff0c;从而导致用户信息泄露、被控制等安全问…...

STM32补充——IAP

0 前置知识&#xff1a; FLASH相关内容&#xff1a;前往STM32补充——FLASH STM32三种烧录方式&#xff08;看看就行&#xff09;&#xff1a; 1.ISP&#xff1a;In System Programming&#xff08;在系统编程&#xff09; 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...

APP加固的那些事

APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择。 引…...

数据分析 基础定义

一、大数据的定义 数据分析是基于商业等目的&#xff0c;有目的的进行收集、整理、加工和分析数据&#xff0c;提炼有价值信息的过程。 大数据分析即针对海量的、多样化的数据集合的分析 大数据分析是一种利用大规模数据集进行分析和挖掘知识的方法。随着互联网、社交媒体、移动…...

PyTorch广告点击率预测(CTR)利用深度学习提升广告效果

目录 广告点击率预测问题数据集结构广告点击率预测模型的构建1. 数据集准备2. 构建数据加载器3. 构建深度学习模型4. 训练与评估 总结 广告点击率预测&#xff08;CTR&#xff0c;Click-Through Rate Prediction&#xff09;是在线广告领域中的重要任务&#xff0c;它帮助广告平…...

嵌入式入门(二)-STM32CubeMX项目开发

使用STM32CubeMX创建项目 本文使用STM32CubeMX模拟器创建一个嵌入式项目的详细流程。 New Project 根据型号搜索 搜索型号&#xff1a; STM32F103C8T6 启动项目 选择STM32F103C8T6后点击 Start Project 配置时钟 切换到 Clock Configuration 修改HCLK -->72MHZ 修改Input fr…...

MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍

MATLAB在绘图时&#xff0c;设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…...

Java菜鸟养成计划(java基础)--java运算符

java中的运算符 1、java中的运算符1.1 、 、-、 * 、/ 、 %1.2 、、-、 *、/、%1.3 、、--【自增\自减运算符】1.4、>、 <、 > 、< 、 、! 、! 1.5、&&、||、|、&1.6、&、|、~、^1.7、>> 、 <<、>>>位运算1.8、?:三目运算符…...

学习笔记——动态规划

递推 1.递推和动态规划有什么关系&#xff1f; 递推问题包括动态规划&#xff0c;动态规划一定是递推&#xff0c;递推不一定是动态规划。 动态规划是一种决策性的问题&#xff0c;是在状态中做最优决策的一种特殊递推算法&#xff0c;通常的问法包括求最大最小值等&#xff…...

蓝桥杯备考:红黑树与map和set

搜索二叉树 我们三种树只了解原理&#xff0c;不写代码&#xff0c;因为我们竞赛不做要求&#xff0c;只是为了使用set和map做铺垫 原理记不住&#xff0c;没关系&#xff0c;我们只要会各种操作的时间复杂度 二叉搜索树的定义 1若左子树非空&#xff0c;左子树所有结点的权…...

第二届生成式人工智能与信息安全国际学术会议(GAIIS 2025)

在线投稿&#xff1a; 学术会议-学术交流征稿-学术会议在线-艾思科蓝 【征文主题】&#xff08;包括但不限于&#xff09; 深度学习 自然语言处理 算法应用 计算机视觉 视觉识别 模式识别 强化学习 生成对抗网络 生成建模技术 语言预训练 视觉预训练 联合预训练…...

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码&#xff0c;状态码含义 在Web开发和调试过程中&#xff0c;HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具&#xff1a; 在大多数浏览器中&#xff0c;您可以通过按下 F12 键或右键单击页面并选择“检查…...

Python 常用运维模块之OS模块篇

Python 常用运维模块之OS模块篇 OS 模块获取当前工作目录更改当前工作目录返回当前目录路径返回上一级目录路径递归生成目录路径删除目录创建目录删除目录列出特定目录下文件和子目录删除某个特定文件重命名某个文件获取某个文件/目录的信息输出目录路径分隔符输出文件行终止符…...

前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!

引言 时光飞逝&#xff0c;2024年已经来临&#xff0c;回顾过去一年&#xff0c;科技的迅猛进步简直让人目不暇接。 在人工智能&#xff08;AI&#xff09;越来越强大的今天&#xff0c;我们不再停留在幻想阶段&#xff0c;量子计算的雏形开始展示它的无穷潜力&#xff0c;Web …...

HTML语言的数据结构

HTML语言的数据结构 引言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的标准语言。尽管HTML本身不是一种编程语言&#xff0c;它为我们提供了一种结构化的信息表示方法&#xff0c;使得网页内容能够有序地展现给用户。HTML的核心在于其标记&#xff08;标签&#…...

怎么创建一个能在线测试php的html5网页?

代码示例&#xff1a; 一、搭建服务器环境 首先&#xff0c;你需要在服务器上搭建 PHP 运行环境。如果你使用的是 Linux 服务器&#xff0c;可以使用 Apache 或 Nginx 作为 Web 服务器&#xff0c;并安装 PHP 解释器。对于 Windows 服务器&#xff0c;可以使用 WAMP&#xff08…...

docker安装elk6.7.1-搜集nginx-json日志

docker安装elk6.7.1-搜集nginx-json日志 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 0.规划 192.168.171.130 nginxfilebeat 192.168.171.131 …...

常见的社交媒体平台有哪些?

社交媒体平台有哪些&#xff1f;在跨境电商和全球营销的过程中&#xff0c;海外社交媒体平台是提高品牌曝光率的重要工具。为了有效管理多个平台的账户&#xff0c;并防止账户之间的关联问题&#xff0c;OKBrow指纹指纹浏览器凭借其强大的多账户管理、防关联技术和隐私保护功能…...

nslookup在内网渗透的使用

1. 什么是 nslookup&#xff1f; nslookup&#xff08;Name Server Lookup&#xff09;是一个用于查询 DNS&#xff08;域名系统&#xff09;记录的命令行工具。通过该工具&#xff0c;用户可以查询域名的解析结果&#xff0c;例如获取某个域名对应的 IP 地址或查找域名的相关记…...

Linux:修改用户名

Linux&#xff1a;修改用户名 0. 注意事项1.创建并切到临时用户tempuser2.更改用户名3.删除临时用户tempuser 更多内容&#xff1a;XiaoJ的知识星球 在Ubuntu系统中&#xff0c;更改用户名。 0. 注意事项 备份重要数据&#xff1a;在更改用户名之前&#xff0c;建议备份重要数…...

IP协议特性

在网络层中&#xff0c;最重要的协议就是IP协议&#xff0c;IP协议也有两个特性&#xff0c;即地址管理和路由选择。 1、地址管理 由于IPv4地址为4个字节&#xff0c;所以最多可以支持42亿个地址&#xff0c;但在现在&#xff0c;42亿明显不够用了。这就衍生出下面几个机制。…...

开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...

14_音乐播放服务_字典缓存避免重复加载

首先在游戏根入口下创建空节点 F2重命名为BGAudio 作为播放 背景音乐的对象 在BGAudio对象上挂载组件 AudioSource 关掉PlayOnAwake 因为我们需要通过代码来控制音效 音量大小设置为0.5 Ctrl d 再复制一份背景播放对象BGAudio 重命名为UIAudio 作为UI窗口操作的播放对象 创建…...

pgsql中处理数组类型字段

1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...

新年好(Dijkstra+dfs/全排列)

1135. 新年好 - AcWing题库 思路&#xff1a; 1.先预处理出1,a,b,c,d,e到其他点的单源最短路&#xff0c;也就是进行6次Dijkstra 2.计算以1为起点的这6个数的全排列&#xff0c;哪种排列方式所得距离最小&#xff0c;也可以使用dfs 1.Dijkstradfs #define int long longusing …...

vscode导入模块不显示类型注解

目录结构&#xff1a; utils.py&#xff1a; import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…...

Stable diffusion 都支持哪些模型

Stable Diffusion 支持多种模型&#xff0c;主要包括以下几类&#xff1a; 官方基础模型&#xff1a; SD 1.x 系列&#xff08;如 Stable Diffusion 1.4、1.5&#xff09;&#xff1a;这是最经典的模型&#xff0c;适合多种通用场景&#xff0c;使用简单且易于上手。SD 2.x 系列…...

C语言操作符(上)

操作符 一&#xff0c;操作符的分类1&#xff0c;算数操作符2&#xff0c;赋值操作符3&#xff0c;逻辑操作符4&#xff0c;条件操作符4&#xff0c;单目操作符5&#xff0c;函数调用和下表访问操作符 二&#xff0c;原码反码补码三&#xff0c;移位操作符1&#xff0c;左移操作…...

Linux TCP 之 RTT 采集与 RTO 计算

我们来看看 Linux TCP 采集 RTT 的函数 tcp_rtt_estimator&#xff0c;看注释&#xff0c;充满了胶着。 但在那个谨慎的年代&#xff0c;这些意味着什么&#xff1f; RTT 最初仅用于 RTO 的计算而不是用于调速&#xff0c;RTO 的计算存在两个问题&#xff0c;如果过估&#x…...

智慧水务管网在线监测平台(Axure高保真原型)

智慧水务管网在线监测平台是一种集成了物联网、大数据、云计算和人工智能等技术的综合管理系统。平台的主要目的是提高水务管理的效率和安全&#xff0c;确保供水系统的稳定运行。 智慧水务管网在线监测平台的主要特点和功能&#xff1a; 综合监测与管理&#xff1a;智慧水务平…...

Kubernetes 架构图和组件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…...

不建模,无代码,如何构建一个3D虚拟展厅?

在数字化浪潮的推动下&#xff0c;众多企业正积极探索线上3D虚拟展厅这一新型展示平台&#xff0c;旨在以更加生动、直观的方式呈现其产品、环境与综合实力。然而&#xff0c;构建一个既专业又吸引人的3D虚拟展厅并非易事&#xff0c;它不仅需要深厚的技术支持&#xff0c;还需…...

MMDetection学习系列(5)——Mask R-CNN深度探索与实战指南

目录 实例分割 R-CNN系列 R-CNN Fast R-CNN Faster R-CNN Mask R-CNN Mask R-CNN 头部结构细节 两阶段架构 损失函数 掩码 RoIAlign Faster R-CNN中的RoIPool Mask R-CNN 中的RoIAlign 实例分割实验 消融研究 定性结果 SOTA 方法比较 Coovally AI模型训练与…...

Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析

目录 前言1. TRANSLATE2. REGEXP_LIKE3. 实战 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. TRANSLATE TRANSLATE 用于替换字符串中指定字符集的每个字符&#xff0c;返回替换后的字符串 逐一映射输入字…...

PHP语言的软件工程

PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支&#xff0c;它涉及软件的规划、开发、测试和维护。在现代开发中&#xff0c;PHP作为一种流行的服务器端脚本语言&#xff0c;广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…...

量变引起质变

量变引起质变&#xff0c;这个是最本质的规律&#xff0c;重复进行一件事情&#xff0c;这件事情就会越来越完善&#xff0c;越来越完美&#xff0c;哪怕是菜鸟&#xff0c;重复多了就是大佬。 我从说话结结巴巴&#xff0c;到说话流畅&#xff0c;只是用了15天直播写代码&…...

【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中&#xff0c;制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动&#xff0c;旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...

Linux内核 -- Linux 的 BIO框架

深入理解 Linux 的 BIO 在 Linux 内核中&#xff0c;BIO&#xff08;Block I/O&#xff09;是块层&#xff08;block layer&#xff09;用于描述块设备 I/O 请求的核心数据结构。它在文件系统与块设备驱动程序之间充当“载体”&#xff0c;负责把数据页及相关元数据从上层提交…...