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

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。

本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易错点。

本文中源码来自Spring 5.3.x分支,github源码地址:GitHub - spring-projects/spring-framework: Spring Framework

一 Spring事务的核心组件

了解相关类和接口,看看Spring对概念、术语是如何封装的?

1.1 PlatformTransactionManager

事务管理器接口,负责获取数据库连接,事务的开启、提交和回滚。

有抽象实现AbstractPlatformTransactionManager,其中定义了doGetTransaction、doBegin、doCommit、doRollback等抽象方法,待子类实现。

AbstractPlatformTransactionManager中有几个值得关注的属性:

// 是否允许嵌套事务
private boolean nestedTransactionAllowed = false;// 局部失败时全局回滚,当为false时,部分失败则不回滚
private boolean globalRollbackOnParticipationFailure = true;private boolean failEarlyOnGlobalRollbackOnly = false;private boolean rollbackOnCommitFailure = false;

它有以下常见子类:

  • DataSourceTransactionManager:用于JDBC和MyBatis等基于数据源的事务管理。
  • HibernateTransactionManager:用于Hibernate框架的事务管理。
  • JpaTransactionManager:用于JPA(Java Persistence API)的事务管理。

DataSourceTransactionManager

该类中定义了两个属性,对doCommit等抽象方法提供实现。

  • doGetTransaction方法:创建一个DataSourceTransactionObject对象,设置connection。

  • doBegin方法:执行事务前的准备工作,如设置
    • 如果DataSourceTransactionObject没有连接,则获取一个连接
    • 根据TransactionDefinition,为connection设置属性,如isolationLevel、readOnly、timeout;
    • connection.setAutoCommit(false),关闭自动提交;
    • 将connection与当前线程绑定;
  • doCommit方法:从TransactionStatus中获取TransactionObject,拿到connection调用commit();

  • doRollback方法:与doCommit实现相似,只是调connection.rollback();

1.2 TransactionDefinition

定义事务的属性,如隔离级别、传播行为、超时时间等。

隔离级别(Isolation Level):定义了事务之间的隔离程度,常见的有:

  • DEFAULT:使用数据库默认的隔离级别。
  • READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读。
  • READ_COMMITTED:只能读取已提交的数据,避免脏读。
  • REPEATABLE_READ:确保在同一事务中多次读取同一数据时,结果一致。
  • SERIALIZABLE:最高的隔离级别,确保事务串行执行,避免脏读、不可重复读和幻读。

超时时间(Timeout):事务的超时时间,超过该时间未完成则自动回滚。

只读(Read-only):指定事务是否为只读事务,优化性能。

在子类DefaultTransactionDefinition中,可以看到默认值:PROPAGATION_REQUIRED、ISOLATION_DEFAULT、TIMEOUT_DEFAULT、非readOnly。

当使用@Transactional时,会将注解属性解析成一个TransactionDefinition对象。

1.3 TransactionStatus

表示事务的状态,提供了以下方法:

  • isNewTransaction():判断当前事务是否为新事务。
  • hasSavepoint():判断是否存在保存点(用于嵌套事务)。
  • setRollbackOnly():标记事务为回滚状态。
  • isRollbackOnly():判断事务是否被标记为回滚。

在子类DefaultTransactionStatus中,有这些属性

private boolean rollbackOnly = false;private boolean completed = false;private final Object transaction;private final boolean newTransaction;private final boolean newSynchronization;private final boolean readOnly;

1.4 TransactionSynchronizationManager

事务同步管理器,用于将事务相关信息与当前线程绑定,以支持各种事务传播行为。其中有多个ThreadLocal属性。

为什么保存连接的resources是Map类型?因为支持多数据源,当一个方法中操作多个数据库时,线程中就得保存多个connectionHolder对象,因此使用Map结构,key就是dataSource对象。

1.5 TransactionInterceptor

事务拦截器,就是AOP的代理逻辑,具体实现在TransactionAspectSupport#invokeWithinTransaction中。

大体流程为:

  1. 获取当前方法的@Transaction注解属性,创建TransactionDefinition对象;
  2. 获取TransactionManager对象;
  3. 根据方法名生成事务名;
  4. 如有必要则创建事务,并处理传播行为;
  5. 在try中执行下一个interceptor或被代理对象中方法;
  6. 异常时先回滚事务,正常时提交事务;
  7. 当前方法执行结束,还原TransactionInfo(恢复上层方法的事务信息)。

二 事务的传播机制

2.1 什么是事务传播

在日常开发中,业务代码中经常出现方法间调用,比如购物时下单减和库存:

import com.xiakexing.dao.InventoryDao;
import com.xiakexing.dao.OrderDao;
import com.xiakexing.entity.Order;public class OrderService {private OrderDao orderDao;private InventoryDao inventoryDao;public void saveOrder(Order order) {orderDao.save(order);updateInventory(order.getCode(), order.getCount());}public void updateInventory(String code, int count) {inventoryDao.update(code, count);}
}
  1. saveOrder()和updateInventory(),所有sql需要在同一个事务中;
  2. 单独调用updateInventory()时,如进货时不需要事务。

可见,updateInventory方法,在不同场景下对事务有不同要求。Spring中又如何实现呢?

Spring定义了传播行为(Propagation Behavior),定义了方法间调用时事务如何传递,类型有:

  • REQUIRED:如果当前线程存在事务,则加入该事务;如果不存在,则创建一个新事务。
  • REQUIRES_NEW:总是创建一个新事务,如果当前线程存在事务,则挂起当前事务。
  • SUPPORTS:如果当前线程存在事务,则加入该事务;如果不存在,则以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行,如果当前线程存在事务,则挂起当前事务。
  • MANDATORY:如果当前线程存在事务,则加入该事务;如果不存在则抛出异常。
  • NEVER:以非事务方式执行,如果当前线程存在事务,则抛出异常。
  • NESTED:如果当前线程存在事务,则以嵌套事务中执行;如果不存在,则创建一个新事务。

这儿为什么强调线程呢?

方法间调用都在某个线程的方法栈中,按FILO顺序执行。如果两个方法的中sql使用两个不同的数据库连接执行,显然无法纳入一个事务中。

因为,数据库连接必须能够跨方法传递,Spring底层就是将connection放到ThreadLocal中。

2.2 传播机制的实现

2.2.1 线程绑定连接

在DataSourceTransactionManager#doBegin中:

  • 从DataSource获取数据连接connection,设置autocommit=false、隔离级别、超时时间等属性;
  • 将connection放入ThreadLocal<Map>,Map的key是DataSource对象,value是connectionHolder对象。

可见,方法间调用时可以从ThreadLocal中拿到同一个连接,去执行不同的SQL,进而一同提交或回滚。

2.2.2 处理传播机制

真正执行被代理对象方法前,会判断是否创建事务。

调用AbstractPlatformTransactionManager#getTransaction,逻辑如下:

  1. 创建DataSourceTransactionObject对象,从ThreadLocal中获取connectionHolder(可能为null);
  2. 当connectionHolder不为null且connectionHolder.transactionActive=ture时,说明已存在事务:

如果当前线程中存在事务:

  • 如果当前方法传播行为是PROPAGATION_NEVER,则抛异常
  • 如果是PROPAGATION_NOT_SUPPORTED,则挂起当前事务,用一个新连接的非事务方式执行当前方法;
  • 如果是PROPAGATION_REQUIRES_NEW,则挂起当前事务,开启一个新事务(获取新连接并带事务执行);
  • 如果是PROPAGATION_NESTED,则先设置savepoints(可以回滚到此处),然后使用同一个连接继续执行。

如果当前线程中不存在事务:

  • 如果传播行为是PROPAGATION_MANDATORY,则抛异常
  • 如果传播行为是PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED,则开启事务

流程图如下:

三 总结

  1. Spring中,对于事务这一抽象概念,从多个方法进行了良好封装,如将隔离级别、超时时间等封装为TransactionDefinition,将事务状态、是否回滚等封装为TransactionStatus。
  2. 事务的传播行为,发生在方法间调用中。通过将connectionHolder放入ThreadLocal,实现了不同方法中使用同一数据库连接,从而支持多种传播方式。
  3. 事务底层,就是通过设置connection.autocommit为false,从而根据方法是否异常,选择commit还是rollback;
  4. 通过Savepoint实现嵌套事务(需要数据库支持)。
  5. 在执行某个方法时,判断当前是否已经存在事务,就是判断当前线程的ThreadLocal中是否存在一个数据库连接对象。

相关文章:

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中&#xff0c;我们熟悉了Spring声明式事务的AOP原理&#xff0c;以及事务执行的大体流程。 本文中&#xff0c;介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中&#xff0c;我们将结合案例&#xff0c;来讲解实战中有关事务的易…...

【实用工具】在 Windows 上使用 JVMS 管理多版本 JDK

文章目录 前言JVMS 的主要功能安装 JVMS初始化 JVMS管理 JDK 版本远程添加&#xff08;这块比较吃网络&#xff0c;如果不成功可以看下面手动添加&#xff09;安装指定版本的 JDK查看本地已安装的 JDK 版本切换 JDK 版本 手动添加 JDK 前言 在 Java 开发过程中&#xff0c;针对…...

前端面试-JavaScript 数据类型详解

目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型&#xff08;原始类型&…...

Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务

一、 报错&#xff1a; navicat连接数据库报错&#xff1a;ORA-12541&#xff1a;TNS:no listener 二、排查问题 三、 解决问题 删除Oracle安装目录下选中的配置&#xff1a;listener.ora 及 listener*.bak相关的 cmd&#xff0c;用管理员打开 执行&#xff1a;netca 命…...

go-micro

一&#xff0c;课程介绍 1&#xff0c;主讲老师: 大地 2&#xff0c;合作网站: www.itying.com 3&#xff0c;我的专栏: https://www.itying.com/category_Z9-b0.html 4,必备基础&#xff1a;学习本教程要有golang和go web基础 5&#xff0c;大地老师Golang入门实战系列教…...

SVN把英文换中文

原文链接&#xff1a;SVN设置成中文版本 都是英文&#xff0c;换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数

ngx_atoi 声明在 src/core/ngx_string.h ngx_int_t ngx_atoi(u_char *line, size_t n); 定义在 src/core/ngx_string.c ngx_int_t ngx_atoi(u_char *line, size_t n) {ngx_int_t value, cutoff, cutlim;if (n 0) {return NGX_ERROR;}cutoff NGX_MAX_INT_T_VALUE / 10;cutlim…...

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...

深度学习技术文章质量提升指南(基于CSDN评分算法优化)

一、质量缺陷诊断&#xff08;基于CSDN质量分V5.0算法&#xff09; 根据1提供的评分框架&#xff0c;当前文章可能存在的质量短板&#xff1a; 技术深度不足&#xff1a;缺乏具体模型实现细节与数学推导结构完整性缺失&#xff1a;未形成"理论-实践-应用"完整闭环代…...

力扣-回溯-37 解数独

思路 双层递归&#xff0c;而且在传递参数使用&的好处是不用在复制一次样本&#xff0c;浪费时间 class Solution { public:bool isVaild(vector<vector<char>> &board, int row, int cal, char val){for(int i 0; i < 9;i){if(board[row][i] val) …...

极简入门,本地部署dify低代码平台构建AI Agent大模型全流程(使用教程、微案例、配置详解、架构图解析)

文章目录 一、环境搭建1.1 安装VMware-workstationCentOS7.91.2 安装宝塔1.3 安装docker及改镜像、安装dify1.4 配置模型供应商 二、dify快速上手体验2.1 知识库2.2 微案例&#xff1a;基于知识库的助手 三、dify知识库配置详解3.1 分片策略3.2 父子分段3.3 索引方法3.4 检索结…...

ssh与服务器

目录 前言&#xff1a; 一、密码连接 二、密钥对连接 1.将公钥放在服务器 2.ssh连接 三、禁用密码 1.进入服务器/etc/ssh文件夹 2.打开sshd_config文件&#xff0c;进行如下配置 3.有可能还需要更改其他文件夹 4.重启ssh服务 四、config 五.ssh与github 1.本地创建…...

C++ bind基本使用

std::bind 是 C11 引入的一个函数模板&#xff0c;用于创建一个新的可调用对象&#xff0c;该对象可以调用某个函数或成员函数&#xff0c;并将一些参数绑定为固定值。通过 std::bind&#xff0c;你可以创建一个新的函数对象&#xff0c;这个对象可以接受剩余的参数&#xff0c…...

【GPT】从GPT1到GPT3

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 从GPT1 到GPT3 1. GPT1 论文&#xff1a; https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/lan…...

Java IO 设计模式总结

装饰器模式 装饰器&#xff08;Decorator&#xff09;模式 可以在不改变原有对象的情况下拓展其功能。 装饰器模式通过组合替代继承来扩展原始类的功能&#xff0c;在一些继承关系比较复杂的场景&#xff08;IO 这一场景各种类的继承关系就比较复杂&#xff09;更加实用。 对…...

js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性

ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言,本文讲述Javascript[ECMAScript]版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]的新特性,帮助朋友们更好的熟悉和使用Javascript ES5 1.严格模式 use strict2.Object getPrototypeOf,返回一个对象的原…...

基于ffmpeg+openGL ES实现的视频编辑工具-解码(四)

在开发视频编辑工具时,预览功能是基石,它涵盖视频、图片以及音频播放,而视频解码则是实现视频预览及后续编辑操作的关键环节。本文聚焦于基于 FFmpeg 实现视频解码的过程,详细阐述开发中遭遇的痛点、对应的解决方式,以及核心代码的运作原理。 一、开发背景与目标 视频编…...

机器学习:决策树

1. 初步概念 决策树是一种基于分裂特征的机器学习方法,用于分类和回归任务。它通过将数据按特征值进行分割,最终做出预测。与线性模型不同,决策树能够自动识别重要的特征,并根据数据情况生成复杂的决策规则。 2. 决策树的核心思想 决策树的核心思想在于选择一个特征作为…...

@media 的常用场景与示例

media 的常用场景与示例 1. 基本概念2. 常用场景2.1 不同屏幕宽度的布局调整2.2 隐藏或显示元素2.3 字体大小调整2.4 图片大小调整2.5 高度调整2.6 颜色调整2.7 鼠标悬停效果 3. 常用示例3.1 基本响应式布局3.2 隐藏侧边栏3.3 字体大小和图片大小 4. 总结 在现代网页设计中&…...

深入浅出:基于SpringBoot和JWT的后端鉴权系统设计与实现

文章目录 什么是鉴权系统定义与作用主要组成部分工作原理常用技术和框架 基于SpringBoot JWT的鉴权系统设计与实现指南前言技术对比令牌技术JWT令牌实现全流程1. **依赖引入**2. **JWT 工具类**3. **JWT 拦截器&#xff08;Interceptor&#xff09;** 4. **拦截器注册**5. **登…...

怎麼利用靜態ISP住宅代理在指紋流覽器中管理社媒帳號?

靜態ISP住宅代理是一種基於真實住宅IP的代理服務。這類代理IP通常由互聯網服務提供商&#xff08;ISP&#xff09;分配&#xff0c;具有非常高的真實性&#xff0c;與普通數據中心代理相比&#xff0c;更不容易被平臺檢測到為“虛假IP”或“代理IP”&#xff0c;靜態ISP住宅代理…...

DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发

Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…...

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…...

Git LFS介绍(Large File Storage)大文件扩展,将大文件存储在外部存储,仓库中只记录文件的元数据(大文件的指针,类似一个小的占位符文件)

文章目录 LFS的功能&#xff1f;如何使用LFS&#xff1f;将大文件存储在外部系统是什么意思&#xff1f;具体是如何运作的&#xff1f;为什么要这样做&#xff1f; 对开发者的影响&#xff1f;1. **性能和效率**2. **协作体验**3. **版本管理差异**4. **额外的工具和配置** LFS…...

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...

三甲医院网络架构与安全建设实战

一、设计目标 实现医疗业务网/卫生专网/互联网三网隔离 满足等保2.0三级合规要求 保障PACS影像系统低时延传输 实现医疗物联网统一接入管控 二、全网拓扑架构 三、网络分区与安全设计 IP/VLAN规划表 核心业务配置&#xff08;华为CE6865&#xff09; interface 100G…...

如何在 React 中测试高阶组件?

在 React 中测试高阶组件可以采用多种策略&#xff0c;以下是常见的测试方法&#xff1a; 1. 测试高阶组件返回的组件 高阶组件本身是一个函数&#xff0c;它返回一个新的组件。因此&#xff0c;可以通过测试这个返回的组件来间接测试高阶组件的功能。通常使用 Jest 作为测试…...

INA219电流、电压、功率测量芯片应用

INA219电流、电压、功率测量芯片应用 简述芯片引脚应用电路寄存器驱动代码 简述 ‌INA219是一款由德州仪器&#xff08;Texas Instruments&#xff09;生产的高精度电流/功率监测芯片&#xff0c;广泛应用于电池监控、电源管理等需要精确电流和功率测量的应用中‌‌。该芯片通…...

深入解析设计模式之工厂模式

深入解析设计模式之工厂模式 在软件开发的复杂体系中&#xff0c;设计模式作为解决常见问题的有效方案&#xff0c;为开发者提供了强大的工具。工厂模式作为一种广泛应用的创建型设计模式&#xff0c;专注于对象的创建过程&#xff0c;通过巧妙的设计&#xff0c;将对象的创建…...

ollama修改监听ip: 0.0.0.0

确认Ollama绑定IP地址 默认情况下&#xff0c;Ollama可能仅监听本地回环地址&#xff08;127.0.0.1&#xff09;。要允许外部访问&#xff0c;需将其配置为监听所有IP&#xff08;0.0.0.0&#xff09;或指定IP&#xff08;如10…19&#xff09;。 修改启动命令&#xff08;推荐…...

.NET MVC实现电影票管理

.NET MVC&#xff08;Model-View-Controller&#xff09;是微软推出的基于 Model-View-Controller 设计模式的 Web 应用框架&#xff0c;属于 ASP.NET Core 的重要组成部分。其核心目标是通过清晰的分层架构实现 高内聚、低耦合 的开发模式&#xff0c;适用于构建可扩展的企业级…...

FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器

本文使用 DDS 生成三个信号&#xff0c;并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号&#xff0c;并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分&#xff1a; 信号生成&#xff1a;展示如何使用DDS&am…...

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…...

vue3父子组件props传值,defineprops怎么用?(组合式)

目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量&#xff0c;修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props&#xff08;:props“”&#xff09;传递数据给子组件 <!-- 父组件…...

Linux /etc/fstab文件详解:自动挂载配置指南(中英双语)

Linux /etc/fstab 文件详解&#xff1a;自动挂载配置指南 在 Linux 系统中&#xff0c;/etc/fstab&#xff08;File System Table&#xff09;是一个至关重要的配置文件&#xff0c;它用于定义系统开机时自动挂载的文件系统。如果你想让磁盘分区、远程存储&#xff08;如 NFS&…...

Test the complete case

Test the complete case python写的一段 由pytest测试框架/allure报告框架/parameters数据驱动组成的完整案例代码 目录结构 project/ ├── test_cases/ │ ├── __init__.py │ └── test_math_operations.py # 测试用例 ├── test_data/ │ └── math_dat…...

装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

问题描述 我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f; 原因分析&#xff1a; 当您在安装Windows操作系统…...

【pytest-jira】自动化用例结合jira初版集成思路

【pytest】编写自动化测试用例命名规范README 【python】连接Jira获取token以及jira对象 【python】解析自动化脚本文件并按照测试周期存储记录 【python】向Jira推送自动化用例执行成功 【python】向Jira测试计划下&#xff0c;附件中增加html测试报告 以下内容主要是介绍jira…...

PHP 会话(Session)实现用户登陆功能

Cookie是一种在客户端和服务器之间传递数据的机制。它是由服务器发送给客户端的小型文本文件&#xff0c;保存在客户端的浏览器中。每当浏览器向同一服务器发送请求时&#xff0c;它会自动将相关的Cookie信息包含在请求中&#xff0c;以便服务器可以使用这些信息来提供个性化的…...

大模型安全问题详解(攻击技术、红队测试与安全漏洞)

文章目录 大模型攻击技术提示注入攻击&#xff08;Prompt Injection&#xff09;数据投毒攻击&#xff08;Data Poisoning&#xff09;模型克隆攻击&#xff08;Model Cloning&#xff09;拒绝服务攻击&#xff08;DoS&#xff09;和拒绝钱包攻击&#xff08;DoW&#xff09;插…...

【愚公系列】《鸿蒙原生应用开发从零基础到多实战》002-TypeScript 类型系统详解

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...

C# 将非托管Dll嵌入exe中(一种实现方法)

一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Microsoft Visual Studio Professional 2022 (64 位) - Current 版本 17.11.4 其他: 二、测试目的 将基于C++创建DLL库,封装到C#生成的exe中。 一般C++创建的库,在C#中使用,都是采用DllImport导入的,且要求库处…...

c sharp 特性详解

文章目录 一、特性基础用法二、常见的内置特性三、自定义特性四、通过反射读取特性五、实际应用场景六、练习 一、特性基础用法 什么是特性&#xff1f; 特性是一种继承System.Attribute类&#xff0c;用于标记代码元素 特性的语法&#xff1a; [AttributeName(Parameter1, P…...

Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?

Langchain vs. LlamaIndex&#xff1a;哪个在集成MongoDB并分析资产负债表时效果更好&#xff1f; 随着大语言模型&#xff08;LLM&#xff09;在实际应用中的普及&#xff0c;许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中&#xff0c;La…...

MySQL日常维护工具------备份

MySQL日常维护工具-备份 一、MySQL字符集 &#xff08;一&#xff09;字符集介绍 字符(Character)是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合&#xff0c;字符集种类较多&#xff0c;每个字符集…...

硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库

文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库&#xff0c;通过将…...

[VSCode]彻底卸载和重装,并搭建Java开发环境

VSCode彻底卸载 由于当初是朋友帮忙装的&#xff0c;所以准备卸载,自己装一遍 从控制面板找到 vscode 将其卸载。 此时仅仅是删除了应用软件 删除安装插件 在图示路径中找到 .vscode 文件夹&#xff0c;将其删除&#xff0c;即可彻底清除安装的插件 C:\Users\user\.vscode …...

Scrum方法论指导下的Deepseek R1医疗AI部署开发

一、引言 1.1 研究背景与意义 在当今数智化时代&#xff0c;软件开发方法论对于项目的成功实施起着举足轻重的作用。Scrum 作为一种广泛应用的敏捷开发方法论&#xff0c;以其迭代式开发、快速反馈和高效协作的特点&#xff0c;在软件开发领域占据了重要地位。自 20 世纪 90 …...

政安晨的AI大模型训练实践 九 - 熟悉LLaMA Factory的详细参数含义-基本概念理解一下

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 小伙伴铁子们&#xff0c;上手先熟悉起来训练工具的每一个参数&#xff0c;很重要。 参照我…...

保姆级教程 | Office-Word中图目录制作及不显示图注引文的方法

背景 由于毕业论文的格式修改需要&#xff08;没错&#xff0c;我终于要拿下PhD了。差不多四个月没更新&#xff0c;主要是①根据处理完的数据完成小论文撰写&#xff1b;②找工作...③完成学位论文的撰写。因而对建模和数据处理的需求不高&#xff0c;对有些时隔久远的博文具…...