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

Spring Cloud Seata 深度解析:原理与架构设计

文章目录

  • 前言:为什么我们需要理解分布式事务?
  • 一、Seata 核心架构深度拆解
    • 1.1 分布式事务核心模型
    • 1.2 Seata undo_log 存储结构与版本控制
      • 存储结构
      • 版本控制核心算法
    • 1.3 Seata 事务模型深度对比与实现原理
      • AT 模式(Auto Transaction)
      • TCC 模式(Try-Confirm-Cancel)
      • Saga 模式
      • XA 模式
      • 模式对比和选型建议
  • 二、Seata 全局锁机制与隔离性
    • 2.1 全局锁的核心设计思想
    • 2.2 全局锁的实现机制
    • 2.3 隔离性实现深度剖析
  • 三、混合事务方案设计
  • 总结


前言:为什么我们需要理解分布式事务?

在微服务架构席卷行业的今天,一个看似简单的电商下单操作,背后可能涉及订单服务、库存服务、支付服务等多个系统的协同。当这些服务分散在不同数据库甚至不同数据中心时,如何保证"扣减库存-生成订单-账户扣款"这一系列操作的原子性?这类问题的答案,正是分布式事务领域持续探索的核心命题。

传统解决方案面临三大困境:
二阶段提交协议(2PC) 的阻塞性问题导致吞吐量骤降
TCC 模式 的代码侵入性使业务逻辑复杂度指数级上升
最终一致性方案 的业务补偿机制开发维护成本高昂
Spring Cloud Seata 的革新之处在于:
AT 模式 通过 SQL 解析 + 自动补偿实现近乎零侵入的事务控制
全局锁优化 在保证隔离性的同时避免长期锁竞争
多模式混用 支持根据业务特征选择最佳事务策略
本博客将带您穿透 API 表象,直击内核设计:

  1. 拆解 Seata 事务上下文传播机制,还原 XID 的分布式链路穿透原理
  2. 深度剖析 undo_log 的二进制存储结构,揭秘数据快照的版本控制算法
  3. 通过真实电商案例,演示如何设计 TCC 模式与 AT 模式的混合事务方案

一、Seata 核心架构深度拆解

1.1 分布式事务核心模型

Seata 基于 XA 模型演进,通过分层架构实现事务控制,其核心模块关系如下:
在这里插入图片描述
Seata 的核心架构由 TC(事务协调者)TM(事务管理器)RM(资源管理器) 组成,三者协同实现分布式事务的一致性:

  • TC:独立部署的服务,负责全局事务的协调,维护事务状态并驱动提交或回滚。
  • TM:定义全局事务边界(如通过 @GlobalTransactional 注解),发起全局事务的开启、提交或回滚。
  • RM:管理分支事务,执行本地事务并向 TC 注册状态,最终根据 TC 指令提交或回滚。
  1. 应用层(Application Layer)
    • TM(Transaction Manager):
      • 全局事务边界定义(@GlobalTransactional)
      • 事务生命周期管理(Begin/Commit/Rollback)
      • 关键实现类:DefaultTransactionManager
    • RM(Resource Manager):
      • 分支事务注册/上报
      • 本地事务状态同步
      • 核心接口:ResourceManager
  2. 核心层(Core Layer)
    • TC(Transaction Coordinator):
      • 全局事务会话管理(GlobalSession)
      • 分支事务调度(BranchSession)
      • 锁冲突检测(LockManager)
      • 核心类关系:
class GlobalSession {private List<BranchSession> branches;private TransactionState status;
}class BranchSession {private String xid;private String resourceId;private Lock lock;
}
  1. 资源层(Resource Layer)
    • 支持多种资源类型:
      • JDBC 数据库(AT 模式)
      • TCC 服务(TCC 模式)
      • MQ 消息队列(Saga 模式)

关键流程交互时序图(含 RPC 细节):
关键流程交互时序图
XID 生成机制:

// 上下文存储结构
public class RootContext {private static ThreadLocal<String> XID = new ThreadLocal<>();// 关键传播载体private static Map<String, String> contextMap = new HashMap<>();
}// 核心算法:UUID(IP + PID + Timestamp) + Port + Sequence
public class UUIDGenerator {private static final AtomicLong SEQUENCE = new AtomicLong(0);private static final int SERVER_NODE_MAX = 0xFFFF;public static String generateXID(int port) {long current = System.currentTimeMillis();return UUID.randomUUID().toString() + ":" + port + ":" + SEQUENCE.incrementAndGet();}
}

XID跨服务传播流程(以HTTP为例):
XID跨服务传播流程
关键传播点实现:
Feign 拦截器示例:

public class SeataFeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {String xid = RootContext.getXID();if (StringUtils.isNotBlank(xid)) {template.header("X-Seata-Xid", xid);}}
}

[核心传播路径]
TM生成XID -> 拦截器注入 -> 网络传输 -> 服务端提取 -> 绑定线程上下文 -> TC注册分支

通过这种设计,Seata 实现了分布式事务上下文在复杂调用链路中的可靠穿透,为事务一致性提供了基础保障。

1.2 Seata undo_log 存储结构与版本控制

存储结构

undo_log 表核心设计:

CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL COMMENT '分支事务ID',`xid` varchar(100) NOT NULL COMMENT '全局事务ID',`context` varchar(128) NOT NULL COMMENT '事务上下文',`rollback_info` longblob NOT NULL COMMENT '回滚日志(压缩后)',`log_status` int(11) NOT NULL COMMENT '状态(0:正常,1:已回滚)',`log_created` datetime NOT NULL COMMENT '创建时间',`log_modified` datetime NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

二进制存储格式详解:

public class RollbackInfo {byte version;          // 版本标识(当前固定为1)short compressorType;  // 压缩算法(0:NONE, 1:GZIP)byte[] beforeImage;    // 前置快照byte[] afterImage;     // 后置快照byte[] changeColumns;  // 变更列元数据
}

数据快照生成算法:

  1. 前置镜像(BeforeImage)捕获
public class BeforeImage {public static byte[] capture(Connection conn, String tableName, String pkName, Object pkValue) {// 生成SELECT SQL (带全局锁)String selectSQL = String.format("SELECT * FROM %s WHERE %s = ? FOR UPDATE", tableName, pkName);try (PreparedStatement ps = conn.prepareStatement(selectSQL)) {ps.setObject(1, pkValue);ResultSet rs = ps.executeQuery();// 转换为ProtoBuf格式return ProtoBufUtils.toBytes(convertToImage(rs));}}
}
  1. 后置镜像(AfterImage)生成
public class AfterImage {public static byte[] capture(Connection conn, SQLRecognizer sqlRecognizer) {// 解析UPDATE/DELETE语句获取条件String whereCondition = sqlRecognizer.getWhereCondition();// 生成SELECT FOR UPDATE SQLString selectSQL = String.format("SELECT * FROM %s WHERE %s FOR UPDATE",sqlRecognizer.getTableName(), whereCondition);// 执行查询并序列化return ProtoBufUtils.toBytes(executeAndConvert(conn, selectSQL));}
}

版本控制核心算法

行级版本标识:

public class RowVersion {private long timestamp;  // 快照时间戳(ms)private int txId;       // 事务ID哈希值private short sequence; // 同一事务内的操作序号public byte[] toBytes() {ByteBuffer buffer = ByteBuffer.allocate(14);buffer.putLong(timestamp);buffer.putInt(txId);buffer.putShort(sequence);return buffer.array();}
}

多版本并发控制(MVCC)实现:
多版本并发控制
压缩算法优化:

public class Compressor {public static byte[] compress(byte[] data) {if (data.length < 1024) return data; // 小数据不压缩try (ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(bos)) {gzip.write(data);gzip.finish();return bos.toByteArray();}}
}

总结:
Seata的undo_log采用二进制存储结构,核心包含事务元数据(xid、branch_id) 和压缩后的数据快照(before_image/after_image),通过ProtoBuf序列化实现高效存储。其版本控制原理基于双镜像快照:在DML操作前捕获前置镜像(原数据状态),操作后记录后置镜像(新数据状态),形成完整版本链。回滚时通过对比镜像生成反向SQL,结合全局事务ID(XID)和分支事务ID实现精确的行级版本回溯,同时采用压缩算法和幂等控制确保高效可靠的分布式事务回滚能力。

1.3 Seata 事务模型深度对比与实现原理

AT 模式(Auto Transaction)

  1. 核心原理
    • 自动补偿机制:通过代理数据源拦截SQL,自动生成反向补偿SQL
    • 两阶段优化:
      • 阶段一:业务SQL执行 + 快照生成(before_image/after_image)
      • 阶段二:异步提交/回滚(基于undo_log)
  2. 执行流程
    AT 模式

TCC 模式(Try-Confirm-Cancel)

  1. 核心原理
    • 三阶段控制:
      • Try:资源预留(冻结库存、预扣款)
      • Confirm:确认操作(实际扣减)
      • Cancel:补偿回滚(释放预留资源)
  2. 执行流程
    TCC执行流程
    这种代码侵入性就很高了,需要实现三个接口,是强一致性的事务模型。

Saga 模式

  1. 核心原理
  • 事件驱动: 通过服务编排执行正向操作
  • 补偿机制: 每个正向操作需定义对应的补偿操作
  • 最终一致性: 允许中间状态存在,通过重试保证最终一致
  1. 执行流程
    Saga 模式

XA 模式

  1. 核心原理
    • 标准协议:基于数据库XA协议实现
    • 两阶段提交:
      • Prepare:所有参与者锁定资源
      • Commit/Rollback:统一提交或回滚
  2. 执行流程
    XA 模式

模式对比和选型建议

模式对比:

对比维度AT 模式TCC 模式Saga 模式XA 模式
代码侵入性零侵入
一致性弱(最终一致)最终一致
性能最高
隔离性读未提交可串行化可串行化
回滚方式自动SQL补偿手动Cancel自定义补偿自动回滚
适用场景常规业务操作资金交易跨系统长流程传统数据库集成

选型建议指南:

  1. 优先选择AT模式:
    • 当业务以CRUD为主
    • 无高频热点数据竞争
    • 典型场景: 电商普通订单、CMS内容更新
  2. 必须使用TCC模式:
    • 涉及资金账户变更
    • 需要强一致性保证
    • 典型场景: 跨境支付、股票交易
  3. 考虑Saga模式:
    • 跨多系统长流程(>30秒)
    • 允许中间状态可见
    • 典型场景: 保险理赔、供应链协同
  4. XA模式适用场景:
    • 老旧系统改造
    • 数据库原生支持XA
    • 典型场景: 银行核心系统对接

总结:模型本质差异

  1. 数据控制维度:
    • AT:基于SQL解析(数据快照)
    • TCC:基于业务逻辑(资源预留)
    • Saga:基于流程编排(事件驱动)
    • XA:基于数据库协议(资源锁定)
  2. CAP权衡:
    • AT/Saga:偏向AP(高可用)
    • TCC/XA:偏向CP(强一致)
  3. 适用阶段:
    • 设计阶段:根据业务特征选择模型
    • 实施阶段:可混合使用不同模式
    • 运维阶段:监控各模式特有指标(如AT的undo_log增长速率)

二、Seata 全局锁机制与隔离性

2.1 全局锁的核心设计思想

1. 为什么需要全局锁?
在分布式事务场景下,多个事务可能并发修改同一数据。全局锁的核心目标是解决 脏写(Dirty Write) 问题,确保事务的 写隔离性。例如:
事务A(扣减库存)和事务B(修改价格)同时操作同一条商品记录,没有全局锁时,可能发生部分提交覆盖的问题。
2. 全局锁与本地锁的本质区别

对比维度本地锁(如MySQL行锁)Seata全局锁
作用范围单数据库实例内跨所有参与事务的数据库
锁类型物理锁逻辑锁
生命周期事务结束自动释放需等待全局事务结束
冲突检测范围单库事务跨服务/跨库事务

2.2 全局锁的实现机制

1. 锁存储结构(TC端实现)

public class LockManager {// Key格式: dbName.tableName:pkValueprivate ConcurrentMap<String, Lock> lockMap = new ConcurrentHashMap<>();class Lock {String xid;          // 全局事务IDString resourceId;   // 资源标识(如JDBC数据源)long expireTime;     // 锁过期时间}
}

2. 锁获取流程
全局锁获取流程
3. 锁释放策略
正常提交:二阶段完成后立即释放
超时释放:后台线程定期扫描过期锁(默认60秒)

# TC server配置
server.lock.expireTime=60000
server.lock.retryInterval=1000

2.3 隔离性实现深度剖析

1. AT模式的隔离级别

隔离级别实现方式特点
Read Uncommitted(默认)不施加全局锁,允许读取未提交数据高性能,可能脏读
Read Committed通过SELECT … FOR UPDATE显式申请全局锁避免脏读,增加锁竞争

2. 读已提交(Read Committed)实现原理

-- 业务SQL示例
UPDATE product SET stock = stock - 1 WHERE id = 1001;-- Seata自动生成的检查SQL
SELECT * FROM product WHERE id = 1001 FOR UPDATE

3. 幻读问题的处理
不解决幻读:AT模式不保证可重复读和串行化隔离级别
解决方案:

@GlobalTransactional(isolation = Isolation.READ_COMMITTED)
public void updateStock() {// 需要范围锁时手动处理productDao.selectForUpdate("WHERE category=1"); 
}

三、混合事务方案设计

案例背景: 某跨境电商平台需要处理以下场景:

  • 订单创建(AT模式):高频操作,允许短暂不一致
  • 库存扣减(AT模式):常规商品库存管理
  • 跨境支付(TCC模式):涉及货币兑换,需强一致性
  • 积分发放(Saga模式):长周期特性,积分可能延迟到账(如订单完成后3天发放)

服务拆分:
服务拆分
核心代码实现:
订单服务(AT模式):

@GlobalTransactional
public OrderResult createOrder(OrderRequest request) {// AT模式操作orderMapper.insert(order); // 调用库存服务(AT)inventoryFeignClient.deduct(request.getSku(), request.getQty());// 调用支付服务(TCC)paymentService.preparePayment(order.getOrderId(), order.getAmount());// 异步调用积分服务(Saga)sagaClient.start(IntegralSaga.class, order.getUserId(), order.getPoints());
}

支付服务(TCC模式):

@TwoPhaseBusinessAction(name = "payment", commitMethod = "confirm", rollbackMethod = "cancel")
public boolean preparePayment(String orderId, BigDecimal amount) {// Try阶段:资金冻结int affected = accountMapper.freezeAmount(getUserId(), orderId, amount,CurrencyConverter.getRate("USD", "CNY")); // 汇率计算if (affected <= 0) {throw new PaymentException("资金不足");}
}public boolean confirm(BusinessActionContext context) {// Confirm阶段:实际扣款String orderId = (String)context.getActionContext("orderId");return accountMapper.confirmDeduction(orderId) > 0;
}public boolean cancel(BusinessActionContext context) {// Cancel阶段:解冻资金String orderId = (String)context.getActionContext("orderId");return accountMapper.unfreeze(orderId) > 0;
}

事务协调配置:

# application.yml
seata:enabled: trueservice:vgroup-mapping:order-service-group: at-clusterpayment-service-group: tcc-clusterinventory-service-group: at-clusterclient:rm:report-success-enable: truetm:commit-retry-count: 5

异常处理:

异常处理


总结

Seata 通过无侵入的 AT 模式简化了分布式事务管理,结合 TC 集群和全局锁机制保障了数据一致性。在生产实践中,需关注高可用部署、异常处理及性能优化。通过合理选择事务模式(AT/TCC/Saga)和配置调优,可显著提升系统可靠性。


参考资料:

  • Seata 官方文档
  • Spring Cloud Alibaba Seata 集成指南

相关文章:

Spring Cloud Seata 深度解析:原理与架构设计

文章目录 前言&#xff1a;为什么我们需要理解分布式事务&#xff1f;一、Seata 核心架构深度拆解1.1 分布式事务核心模型1.2 Seata undo_log 存储结构与版本控制存储结构版本控制核心算法 1.3 Seata 事务模型深度对比与实现原理AT 模式&#xff08;Auto Transaction&#xff0…...

从产品展示到工程设计:3DXML 转 STP 的跨流程数据转换技术解析

在数字化设计与制造领域&#xff0c;不同格式的三维模型文件常常需要进行转换&#xff0c;以满足不同软件和工作流程的需求。3DXML 和 STP&#xff08;STEP AP214/AP242&#xff09;是工业领域常用的两种三维模型文件格式&#xff0c;3DXML 格式以其轻量化和便于网络传输、可视…...

基于RT-Thread的STM32F4开发第五讲——软件模拟I2C

文章目录 前言一、RT-Thread工程创建二、AT24C02三、函数编写1.I2C_soft.c2.I2C_soft.h3.main.h 四、效果展示五、资源分享总结 前言 本章是基于RT-Thread studio实现软件模拟I2C&#xff0c;开发板是正点原子的STM32F4探索者&#xff0c;使用的RT-Thread驱动是5.1.0&#xff0…...

pkucpc2025 L:Game on Tree

题意 两个人在一棵无根树上玩游戏&#xff0c;每次可以删掉若干个叶子节点&#xff0c;不能操作的人输。 思路 比赛的时候我去写H Quintuple了&#xff0c;队友貌似在我写的时候把这道题讨论出来了。 后来补题的时候花了大概花了70分钟左右ac这道题。 首先考虑一条链的情况…...

大数据实时分析:ClickHouse、Doris、TiDB 对比分析

随着企业对数据分析实时性、复杂性和多样性的要求越来越高,传统的批处理数仓已经无法满足实时指标看板、流量监控、用户行为分析等场景需求。因此,越来越多的公司开始引入实时分析型数据库系统。 目前,国内外常见的实时分析数据库有: ClickHouse:列式数据库,极致的分析性…...

网络流量分析系统的十大应用场景

在现代企业和组织的IT运维体系中&#xff0c;网络流量分析系统&#xff08;Network Traffic Analysis, NTA&#xff09;早已不仅仅是用来查看带宽使用率的“流量计数器”。随着网络环境的复杂化、攻击技术的不断演进&#xff0c;以及对业务连续性要求的提升&#xff0c;网络流量…...

问题 | 代码审查:函数是否包含返回语句

“函数是否包含返回语句”这一问题的核心是&#xff1a;在编程中&#xff0c;函数是否按照设计要求正确使用了 返回语句&#xff08;如 return、return value&#xff09;&#xff0c;以便向调用者传递结果或控制权。以下是详细解释&#xff1a; 1. 什么是函数的返回语句&#…...

Spring Bean 生命周期中设计模式的应用与解析

Spring Bean 生命周期中使用的设计模式 Spring Bean 的生命周期涉及多个阶段和扩展点&#xff0c;Spring 框架在这一过程中巧妙运用了多种设计模式&#xff0c;以实现强大的功能和灵活性。以下是主要设计模式及其应用场景&#xff1a; 1. 工厂模式&#xff08;Factory Patter…...

设计模式的原理及深入解析

创建型模式 创建型模式主要关注对象的创建过程&#xff0c;旨在通过不同的方式创建对象&#xff0c;以满足不同的需求。 工厂方法模式 定义&#xff1a;定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 解释&#xff1a;工厂方法模式通过定义一个创建对象的…...

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别&#xff1a; SharingStarted.Eagerly: 立即开始收集上游流&#xff0c;即使没有下游订阅者持续保持活跃状态&#xff0c;直到 ViewModel 被清除优点&#xff1a;响应更快&#xff0c;数据始终保持最新缺点&#xff1a;消耗更多资源&#x…...

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略&#xff0c;让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略&#xff0c;让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略&#xff0c;让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...

python使用jsonpath-ng库操作json数据

jsonpath-ng 库的详细使用如下&#xff1a; 一、安装与导入 安装 通过 pip 安装库&#xff1a; pip install jsonpath-ng支持 Python 3.6 及以上版本。 导入核心模块 主要使用 parse 函数和 JSONPath 对象&#xff1a; from jsonpath_ng import parse二、基础查询操作 1. 简单…...

通用简洁工作汇报项目评估营销策划工作总结年终汇报PPT模版8套一组分享

工作总结汇报PPT模版8套一组分享&#xff1a;工作总结汇报PPT模版分享https://pan.quark.cn/s/04b7ab7a47c4 第一套PPT模版&#xff0c;主要是黄色和灰色调&#xff0c;上方有大面积黄色不规则形状背景&#xff0c;有“POWERPOINT”和“XXXXPPT模版”字样&#xff0c;左侧是黑…...

掌握Git:版本控制与高效协作指南

一、初始Git 提出问题&#xff1a;无论是在工作还是学习&#xff0c;我们在编写各种文档的时候&#xff0c;更改失误&#xff0c;失误后恢复到原来版本&#xff0c;不得不复制出一个副本。 每个版本由各自的内容&#xff0c;但最终只有一个报告需要被我们使用。 但在此之前的…...

ubuntu下配置vscode生成c_cpp_properties.json

-------------学习记录--------------- 在ubuntu下使用vscode时发现cpp文件无法读到头文件&#xff0c;明明头文件在合适的路径下&#xff0c;由于没有制定头文件的路径造成的这个问题。用这篇文章进行简单记录解决方法 ctrlshiftp打开命令面板&#xff0c;也可以点击左上角, …...

Qt读取Excel文件的技术实现与最佳实践

目录 一、成果展示二、核心方法及原理1. QAxObject&#xff08;基于COM接口&#xff09;2. 第三方库QXlsx3. ODBC数据库驱动 三、实现步骤详解1. QAxObject读取Excel&#xff08;需安装Excel/WPS&#xff09;2. QXlsx读取Excel&#xff08;跨平台方案&#xff09; 四、技术选型…...

双条件拆分工作表,一键生成独立工作簿-Excel易用宝

你是否遇到过这样的崩溃瞬间&#xff1f;面对一张密密麻麻的销售数据表&#xff0c;需要按指定维度拆分成工作簿和工作表&#xff0c;而你却只能手动复制粘贴到不同工作簿、工作表&#xff0c;改一个字段就花半小时&#xff0c;数据量大时甚至要熬夜加班&#xff1f; 别担心&a…...

iOS 蓝牙开发中的 BT 与 BLE

在 iOS 开发者的语境里,大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范,但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic(经典蓝牙)又叫 BR/EDR(Basic R…...

TCP和套接字SSL加密连接行为分析

目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL&#xff08;Secure S…...

kafka 问与答

kafka Q&A How does the client connect to kafka and discovery the brokers. client 只需要知道一部分nodes(brokers)的地址既可以&#xff0c;client 会自动发现剩下的所有topic partition leader nodes, 然后连接上。 When a client connects:It uses the bootstrap…...

docker默认存储迁移

在容器化场景下默认存储路径为&#xff08;/var/lib/docker&#xff09;大多数平台根目录不支持系统盘扩容&#xff0c;会有空间不足风险隐患&#xff0c;因未配置持久化存储导致容器数据丢失。以迁移Docker存储路径至大容量/data目录说明 一、停止容器 systemctl stop docke…...

Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0

文章目录 0. 引言1. 准备交叉编译工具链2. 安装依赖工具3. 下载 OpenCV 源码4. 创建交叉编译工具链文件5. 配置 CMake 构建6. 构建 OpenCV7. 安装 OpenCV8. 验证9. 问题及解决办法 0. 引言 Ubuntu20.04系统下使用交叉编译工具链&#xff08;aarch、x86&#xff09;交叉编译ope…...

R语言数据可视化

R note book 文档–输出html格式文档&#xff0c;plotly不能生成PDF文件 --- title: "R语言数据可视化" output: html_notebook ---在R语言中进行数据可视化是数据分析和呈现的重要环节&#xff0c;R提供了多种强大的绘图系统和工具。以下是常见的数据可视化方法和示…...

NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)

引言&#xff1a;语言与矩阵的奇妙邂逅 在自然语言处理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每个词语都像被施了变形术的精灵&#xff0c;在数学的殿堂中翩翩起舞。当我们用"king - man woman queen"这样的向量魔法破解语义密码时&#xff0c;线性…...

【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ

最大连续1的个数 Ⅲ 一、题目链接二、题目三、题目解析四、算法原理解法一&#xff1a;暴力枚举 zero计数器解法二&#xff1a;滑动窗口 五、编写代码六、时空复杂度 一、题目链接 最大连续1的个数 Ⅲ 二、题目 三、题目解析 注意题目中说的是最多k次&#xff0c;在一个数组…...

Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函数解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 内核中用于将进程以独占方式加入等待队列的关键函数,其主要功能包括: 标记独占等待:通过设置 WQ_FLAG_EXCLUSIVE 标志,表明此等待条目是独占的。 安全入队:在自旋锁保护下,将条…...

分布式数据库TiDB:深度解析原理、优化与架构设计

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】 一、TiDB架构设计与核心原理 1.1 分布式架构演进 传统分库分表 vs TiDB架构 #mermaid-svg-8I88Hg2AVkzYTb3O {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fi…...

【深度学习基础】损失函数与优化算法详解:从理论到实践

【深度学习基础】损失函数与优化算法详解&#xff1a;从理论到实践 一、引言 1. 损失函数与优化算法在深度学习中的核心作用 在深度学习中&#xff0c;模型训练的本质是通过不断调整参数&#xff0c;使模型输出尽可能接近真实值。这一过程的核心驱动力是损失函数&#xff08;…...

睿抗足球机器人

目录 大框架 战术 Lua脚本语言编辑环境 大框架 策略脚本&#xff08;LUA-官方脚本&#xff09;、决策算法&#xff08;C-自定义&#xff09;、ROS系统 战术 我们研究了场地的长度、宽度、禁区范围、机器人运动速度等等&#xff0c;发现即使 Kicker 点球往极端角度踢&#xf…...

助力DBA技能无缝平迁 | YashanDB携最新成果亮相XCOPS智能运维管理人年会

5 月 16 日&#xff0c;由上海市软件行业协会、上海市计算机行业协会指导&#xff0c; dbaplus社群主办的XCOPS智能运维管理人年会在广州盛大召开&#xff0c;活动汇聚500余名金融、政府、能源、教育、电信、交通等领域的行业专家。深算院崖山数据库受邀参会&#xff0c;系统性…...

服务端安全测试:OWASP ZAP使用

ZAP下载地址:https://www.zaproxy.org/download/ ZAP有两种扫描方式: 1、使用 OpenAPI / Swagger 地址进行扫描 2、ZAP Proxy + Postman 因为业务云没有添加swagger插件所以本次介绍第2种方式。 【第一步】设置 ZAP 的代理端口(默认是 127.0.0.1:8080) 成功安装并打…...

Amazon Q 从入门到精通 – 测试与重构

Amazon Q Developer 是亚马逊推出的一个专为专业开发人员设计的人工智能助手&#xff0c;旨在提升代码开发和管理效率。其主要功能包括代码生成、调试、故障排除和安全漏洞扫描&#xff0c;提供一站式代码服务。 众所周知&#xff0c;在软件开发领域&#xff0c;测试代码是软件…...

[CSS3]属性增强2

空间转换 使用transform属性实现元素在空间内的位移、旋转、缩放等效果 空间: 是从坐标轴角度定义的。x、y 和z三条坐标轴构成了一个立体空间&#xff0c;z轴位置与视线方向相同。空间转换也叫3D转换 空间位移 使用translate实现元素空间位移效果 transform: translate3d(x…...

Go 语言 vs C+Lua(Skynet)游戏服务器方案对比分析

为啥挑这两个呢&#xff1f;因为两种技术分别对应CSP模型和Actor模型&#xff0c;都是经过时间检验的成熟且可靠的并发模型&#xff0c;问了很多地方&#xff0c;经过gpt整理得出如下报告。 从开发效率、运行性能、热更新扩展、云部署与水平扩展能力、多类型游戏支持等五个维度…...

ArcGIS Pro 3.4 二次开发 - 内容

环境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目录 内容1 工程1.1 创建一个空工程1.2 使用指定名称创建新工程1.3 使用Pro的默认设置创建新工程1.4 使用自定义模板文件创建新工程1.5 使用 ArcGIS Pro 提供的模板创建工程1.6 打开现有工程1.7 获取当前工程1.8 获取当前工程的…...

java每日精进 5.19【Excel 导入导出】

基于 EasyExcel 实现 Excel 的读写操作&#xff0c;可用于实现最常见的 Excel 导入导出等功能。 Excel 导入导出功能涉及前后端协作&#xff0c;后端处理数据查询、文件生成和解析&#xff0c;前端提供用户交互和文件下载/上传界面。以下是全流程解析&#xff0c;分为导出流程…...

基于Elasticsearch的搜索引擎简介

## 一、Elasticsearch简介 Elasticsearch&#xff08;简称ES&#xff09;是一个开源的、分布式、RESTful风格的搜索和数据分析引擎&#xff0c;基于Apache Lucene开发。它能够实现对海量结构化和非结构化数据的实时存储、搜索和分析&#xff0c;广泛应用于全文检索、日志分析、…...

不同类型桥梁的无人机检测内容及技术难度

不同类型桥梁的无人机检测内容及技术难度 无人机桥梁检测的难度因桥梁类型、结构特点和所处环境的不同而存在显著差异。以下是针对梁桥、拱桥、斜拉桥、悬索桥等主要桥梁类型的无人机检测难度分析&#xff1a; 1. 梁桥&#xff08;简支梁、连续梁&#xff09; 检测难度&#x…...

数据结构实验10.1:内部排序的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容1. 数据生成与初始化2. 排序算法实现&#xff08;1&#xff09;直接插入排序&#xff08;2&#xff09;二分插入排序&#xff08;3&#xff09;希尔排序&#xff08;4&#xff09;冒泡排序&#xff08;5&#xff09;快速…...

java20

1.List集合 2.数据结构之栈&#xff0c;队列&#xff0c;数组&#xff0c;链表 3.ArrayList集合 4.LinkedList 5.泛型 注意&#xff1a;E...e是指若干个变量...

LLM笔记(九)KV缓存(2)

文章目录 1. 背景与动机2. 不使用 KV Cache 的情形2.1 矩阵形式展开2.2 计算复杂度 3. 使用 KV Cache 的优化3.1 核心思想3.2 矩阵形式展开3.3 计算复杂度对比 4. 总结5. GPT-2 中 KV 缓存的实现分析5.1 缓存的数据结构与类型5.2 在注意力机制 (GPT2Attention) 中使用缓存5.3 缓…...

将 Element UI 表格拖动功能提取为公共方法

为了在多个页面复用表格拖动功能&#xff0c;我们可以将其封装成以下两种形式的公共方法&#xff1a; 方案一&#xff1a;封装为 Vue 指令&#xff08;推荐&#xff09; 1. 创建指令文件 src/directives/tableDrag.js import interact from interactjs;export default {inse…...

项目中把webpack 打包改为vite 打包

项目痛点: 老vu e-cli1创建的项目,项目是ERP系统集成了很多很多管理,本地运行调试的时候,每次修改代码都需要等待3分钟左右的编译时间,严重影响开发效率. 解决方案: 采用vite构建项目工程 方案执行 第一步 使用vite脚手架构件一个项目,然后把build文件自定义的编译逻辑般到…...

Vue3 Element Plus 中el-table-column索引使用问题

在 Element Plus 的 el-table 组件中&#xff0c;使用 scope.index 是不准确的。正确的索引属性应该是 scope.$index。你的代码需要调整为&#xff1a; vue 复制 下载 <el-button type"primary" size"default" text click"onModifyClick(scope…...

盲盒一番赏小程序系统发展:创新玩法激发市场活力

盲盒一番赏小程序系统凭借其创新的玩法&#xff0c;在潮玩市场中脱颖而出&#xff0c;激发了市场的无限活力。它不仅保留了传统一番赏百分百中奖的特点&#xff0c;还结合线上平台的优势&#xff0c;开发出了更多新颖的玩法。 例如&#xff0c;小程序系统设置了赏品回收功能。…...

MySQL故障排查

目录 MySQL 单示例故障排查 故障现象一​ 故障现象二 故障现象三 故障现象四 故障现象五 故障现象六 故障现象七 故障现象八 MySQL主从复制排查 故障现象一 故障现象二 故障现象三 MySQL 优化 硬件方面 关于CPU 关于内存 关于磁盘 MySQL配置文件 核…...

微服务项目->在线oj系统(Java版 - 4)

相信自己,终会成功 目录 B端用户管理 C端用户代码 发送验证码: 验证验证码 退出登录 登录用户信息功能 用户详情与用户编辑 用户竞赛接口 用户报名竞赛 用户竞赛报名接口查询 用户信息列表 ThreadLocalUtil Hutool工具库 常用功能介绍 B端用户管理 进行列表显示与…...

DDoS与CC攻击:谁才是服务器的终极威胁?

在网络安全领域&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;与CC&#xff08;Challenge Collapsar&#xff09;攻击是两种最常见的拒绝服务攻击方式。它们的目标都是通过消耗服务器资源&#xff0c;导致服务不可用&#xff0c;但攻击方式、威胁程度和防御策略存在显…...

旧物回收小程序,一键解决旧物处理难题

在快节奏的现代生活中&#xff0c;我们常常会面临旧物处理的困扰。扔掉觉得可惜&#xff0c;留着又占空间&#xff0c;而且处理起来还十分麻烦。别担心&#xff0c;我们的旧物回收小程序来啦&#xff0c;只需一键&#xff0c;就能轻松解决你的旧物处理难题&#xff01; 这款小…...

uniapp小程序获取手机设备安全距离

utils.js let systemInfo null;export const getSystemInfo () > {if (!systemInfo) {systemInfo uni.getSystemInfoSync();// 补充安全区域默认值systemInfo.safeAreaInsets systemInfo.safeAreaInsets || {top: 0,bottom: 0,left: 0,right: 0};// 确保statusBarHei…...