mysql 存储过程和自定义函数 详解
首先创建存储过程或者自定义函数时,都要使用use database 切换到目标数据库,因为存储过程和自定义函数都是属于某个数据库的。
存储过程是一种预编译的 SQL 代码集合,封装在数据库对象中。以下是一些常见的存储过程的关键字:
存储过程
1. 存储过程的定义
-
CREATE PROCEDURE: 用于创建一个新的存储过程。
CREATE PROCEDURE procedure_name (parameter_list) BEGIN-- 存储过程体 END;
-
DROP PROCEDURE: 用于删除已存在的存储过程。
DROP PROCEDURE procedure_name;
2. 参数定义
-
IN: 表示输入参数。
-
OUT: 表示输出参数。
-
INOUT: 表示既可以输入又可以输出的参数。
CREATE PROCEDURE my_procedure(IN param1 INT, OUT param2 INT) BEGIN-- 存储过程体 END;
3. 变量声明与操作
-
DECLARE: 定义局部变量、条件和游标。
DECLARE var1 INT DEFAULT 0; DECLARE var2 VARCHAR(50);
-
SET: 用于给变量赋值。
SET var1 = 10;
4. 控制流程
-
BEGIN/END: 标记存储过程块的开始和结束。
BEGIN-- 存储过程体 END;
-
IF 条件判断
IF
语句用于简单的条件分支。语法格式:
IF condition THENSQL逻辑 ELSEIF condition THENSQL逻辑 ELSESQL逻辑 END IF;
案例:
根据用户 ID 返回不同的信息。
DELIMITER // CREATE PROCEDURE CheckUser(IN userId VARCHAR(32)) BEGINDECLARE userName VARCHAR(32);IF userId = 'APP-2016-00494878' THENSELECT username INTO userName FROM users WHERE userid = userId;SELECT userName;ELSEIF userId = 'APP-2016-7777777' THENSELECT userage INTO userName FROM users WHERE userid = userId;SELECT userName;ELSESELECT userId;END IF; END // DELIMITER ;
调用存储过程:
CALL CheckUser('APP-2016-00494878');
-
CASE: 用于多条件判断。
-
语法格式:
CASEWHEN condition1 THENSQL逻辑WHEN condition2 THENSQL逻辑ELSESQL逻辑 END CASE;
-
根据用户角色返回不同的权限级别。
-
DELIMITER // CREATE PROCEDURE GetUserRole(IN userId INT) BEGINDECLARE userRole VARCHAR(20);SELECT role INTO userRole FROM users WHERE id = userId;CASE userRoleWHEN 'admin' THENSELECT 'Administrator';WHEN 'user' THENSELECT 'Standard User';ELSESELECT 'Guest';END CASE; END // DELIMITER ;
调用存储过程:
CALL GetUserRole(1);
-
LOOP/WHILE/REPEAT: 实现循环操作。
LOOP_LABEL: LOOP-- 循环体IF condition THENLEAVE LOOP_LABEL;END IF; END LOOP;
WHILE 循环
WHILE
循环在条件为真时执行循环体中的 SQL 语句。
语法格式:
WHILE 条件 DOSQL逻辑
END WHILE;
案例:
计算从 1 累加到 n 的值,n 为传入的参数值。
DELIMITER //
CREATE PROCEDURE CalculateSum(IN n INT)
BEGINDECLARE total INT DEFAULT 0;WHILE n > 0 DOSET total = total + n;SET n = n - 1;END WHILE;SELECT total;
END //
DELIMITER ;
调用存储过程:
CALL CalculateSum(100);
REPEAT 循环
REPEAT
循环至少执行一次循环体中的 SQL 语句,直到条件为真时退出循环。
语法格式:
REPEATSQL逻辑
UNTIL 条件
END REPEAT;
案例:
计算从 1 累加到 n 的值,n 为传入的参数值。
DELIMITER //
CREATE PROCEDURE CalculateSumRepeat(IN n INT)
BEGINDECLARE total INT DEFAULT 0;REPEATSET total = total + n;SET n = n - 1;UNTIL n <= 0END REPEAT;SELECT total;
END //
DELIMITER ;
调用存储过程:
CALL CalculateSumRepeat(100);
LOOP 循环
LOOP
循环是无条件循环,通常与 LEAVE
语句结合使用来退出循环。
语法格式:
[loop_label:] LOOPSQL逻辑
END LOOP [loop_label];
案例:
计算从 1 累加到 n 的值,n 为传入的参数值。
DELIMITER //
CREATE PROCEDURE CalculateSumLoop(IN n INT)
BEGINDECLARE total INT DEFAULT 0;sum_loop: LOOPIF n <= 0 THENLEAVE sum_loop;END IF;SET total = total + n;SET n = n - 1;END LOOP sum_loop;SELECT total;
END //
DELIMITER ;
调用存储过程:
CALL CalculateSumLoop(100);
5. 条件处理
-
DECLARE HANDLER: 定义异常处理程序。
DECLARE CONTINUE HANDLER FOR SQL_ERROR_CODE error_code BEGIN-- 异常处理语句 END;
6. 游标操作
-
DECLARE CURSOR: 声明游标。
DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table WHERE condition;
-
OPEN CURSOR: 打开游标。
OPEN cursor_name;
-
FETCH CURSOR: 读取游标数据。
FETCH cursor_name INTO var1, var2;
-
CLOSE CURSOR: 关闭游标。
CLOSE cursor_name;
7. 调试与优化
-
SET: 调整优化器参数。
SET optimizer_switch = 'index_merge=on';
-
SHOW VARIABLES: 查看系统变量。
SHOW VARIABLES LIKE 'optimizer_switch';
8.案例
以下是一个包含事务处理的存储过程示例:
DELIMITER //CREATE PROCEDURE transfer_funds(IN from_account INT, IN to_account INT, IN amount DECIMAL(10,2))
BEGINSTART TRANSACTION;IF amount > 0 THEN-- 从源账户扣除金额UPDATE accounts SET balance = balance - amount WHERE id = from_account;-- 向目标账户增加金额UPDATE accounts SET balance = balance + amount WHERE id = to_account;-- 提交事务COMMIT;ELSE-- 回滚事务ROLLBACK;END IF;
END //DELIMITER ;
这个存储过程通过事务确保资金转账操作的原子性。
9.补充知识:游标
注意事项
-
游标只能在存储过程和函数中使用。
-
游标是只读的,不能用于修改数据,但可以通过
SELECT
查询结果集。 -
需要显式地打开和关闭游标,以确保资源的正确释放。
通过使用游标,可以对查询结果集进行逐行处理,这对于需要对每行数据执行复杂操作的场景非常有用
DELIMITER //
CREATE PROCEDURE ProcessOrders()
BEGINDECLARE done INT DEFAULT 0;DECLARE orderId INT;DECLARE orderStatus VARCHAR(20);-- 声明一个名为 cur 的游标。-- 该游标基于查询 SELECT id, status FROM orders,用于存储查询结果集。-- 可以通过游标逐行访问和操作 orders 表中的每一行数据。DECLARE cur CURSOR FOR SELECT id, status FROM orders;-- 定义一个异常处理程序,当游标遍历完所有行(触发 NOT FOUND 异常)时,将变量 done 设置为 1。DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur; -- 打开游标order_loop: LOOPFETCH cur INTO orderId, orderStatus; -- 从游标中提取数据IF done THENLEAVE order_loop; -- 如果没有更多数据,退出循环END IF;-- 在这里处理每一行数据UPDATE orders SET status = 'processed' WHERE id = orderId;END LOOP order_loop;CLOSE cur; -- 关闭游标
END //
DELIMITER ;
在这个存储过程中,当游标遍历完所有行时,FETCH cur INTO orderId, orderStatus
会触发 NOT FOUND
异常。此时,CONTINUE HANDLER
将 done
设置为 1,退出循环。
通过这种方式,可以优雅地处理游标遍历完成的情况,确保程序不会因异常而中断。
10.查询当前数据库有哪些存储过程
SELECT SPECIFIC_NAME AS '存储过程名', ROUTINE_SCHEMA AS '数据库名', CREATED AS '创建时间', LAST_ALTERED AS '最后修改时间'
FROM information_schema.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'AND ROUTINE_SCHEMA = 'test_mybatis';
自定义函数
1. 定义自定义函数
-
CREATE FUNCTION: 用于创建一个新的自定义函数。
CREATE FUNCTION function_name (parameter_list) RETURNS return_type BEGIN-- 函数体 END;
-
function_name: 函数名称。
-
parameter_list: 参数列表,参数可以是
IN
类型。 -
RETURNS: 指定函数返回值的类型。
-
2. 参数定义
-
IN: 定义输入参数。MySQL 的自定义函数只支持
IN
类型的参数。CREATE FUNCTION add_numbers(IN a INT, IN b INT) RETURNS INT BEGINRETURN a + b; END;
3. 函数体
-
BEGIN/END: 标记函数体的开始和结束。
BEGIN-- 函数逻辑 END;
4. 返回值
-
RETURN: 用于返回函数的计算结果。
RETURN value;
5. 属性
-
DETERMINISTIC 或 NOT DETERMINISTIC: 标记函数是否是确定性的。
-
确定性函数:对于相同的输入参数总是返回相同的结果。
-
非确定性函数:对于相同的输入参数可能返回不同的结果。
CREATE FUNCTION function_name (parameter_list) RETURNS return_type DETERMINISTIC BEGIN-- 函数逻辑 END;
-
6. 修改或删除函数
-
ALTER FUNCTION: 修改已存在的自定义函数。
-
DROP FUNCTION: 删除已存在的自定义函数。
DROP FUNCTION function_name;
7. 调用函数
-
可以直接在 SQL 语句中调用自定义函数。
SELECT add_numbers(5, 10);
存储过程和自定义函数区别
特性 | 存储过程 | 自定义函数 |
---|---|---|
定义 | 是一组预编译的 SQL 语句和流程控制语句的集合,可以包含多个 SQL 语句和复杂逻辑。 | 是一个用户定义的函数,用于封装特定的功能逻辑,返回一个值。 |
返回值 | 可以没有返回值,也可以通过 OUT 参数返回多个值。 | 必须返回一个值,返回值类型在创建函数时指定。 |
参数类型 | 支持 IN 、OUT 和 INOUT 类型的参数。 | 只支持 IN 类型的参数。 |
调用方式 | 使用 CALL 语句调用,不能在 SELECT 中直接调用。 | 可以在 SQL 语句中直接调用,如 SELECT 、WHERE 、ORDER BY 等。 |
事务处理 | 可以包含事务操作,控制事务的提交和回滚。 | 不支持事务操作。 |
代码重用 | 适合封装复杂的业务逻辑,便于维护和代码重用。 | 适合封装简单的逻辑,如计算、转换或条件判断,便于在多个地方重用。 |
性能 | 存储过程在服务器端执行,与应用程序交互次数少,性能较高。 | 自定义函数在查询中调用时,可能会导致性能问题,需要谨慎使用。 |
适用场景 | 适用于执行复杂操作的场景,如批量更新数据、执行多个 SQL 语句或返回结果集。 | 适用于需要返回单个值的场景,如计算、转换或简单的逻辑判断。 |
总结
-
存储过程:适合执行复杂的操作,可以返回多个值或结果集,适用于批量更新数据、执行多个 SQL 语句或返回结果集等场景。
-
自定义函数:适合返回单个值的简单逻辑,可以直接在 SQL 语句中调用,适用于计算、转换或条件判断等场景。
相关文章:
mysql 存储过程和自定义函数 详解
首先创建存储过程或者自定义函数时,都要使用use database 切换到目标数据库,因为存储过程和自定义函数都是属于某个数据库的。 存储过程是一种预编译的 SQL 代码集合,封装在数据库对象中。以下是一些常见的存储过程的关键字: 存…...
数据结构:单链表
1.概念: 单链表(Singly Linked List)是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含两个部分: 数据域(Data):存储节点的值或数据。…...
部署项目(ubantu服务器,配置jdk,启动项目,及测试)
目录 1、ubantu安装jdk 2、部署项目 解决 java -jar 报错:xxx.jar 中没有主清单属性 3、测试 4、查看系统部署的应用 1、ubantu安装jdk #压缩文件jdk文件:tar -czvf jdk17.tar.gz jdk17 #解压jdk文件:tar -xzvf jdk17.tar.gz 参…...
deepseek本地部署教程
第一步:进入Ollama官网 (Download Ollama on macOS),下载ollama(注意需要Window10或更高的版本),安装(OllamaSetup.exe),默认在c盘 第二步:点击Models,再点击…...
MySQL主从同步+binlog
一、简介 MySQL内建的复制功能是构建大型,高性能应用程序的基础 通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而…...
防火墙术语大全( Firewalld Glossary of Terms)
防火墙术语大全 防火墙作为网络安全中不可或缺的设备,在各种网络架构中扮演着至关重要的角色。无论是企业级防火墙、云防火墙还是家用路由器内置的防火墙,它们的工作原理和配置策略都离不开一系列专业术语的支撑。对于网络工程师来说,掌握这…...
LeetCode刷题---数组---697
数组的度 697. 数组的度 - 力扣(LeetCode) 题目: 给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&am…...
C语言基础08:运算符+流程控制总结
运算符 算术运算符 结果:数值 、-、*、\、%、(正)、-(负)、、-- i和i 相同点:i自身都会增1 不同点:它们运算的最终结果是不同的。i:先使用,后计算;i&am…...
[安装FlashAttention] CUDA版本 和 Nvidia驱动版本
nvidia-smi 查看driver api 的CUDA版本 听说这个是本机能装到的最高版本 那这样看来我最高能装到12.4。 nvcc -V 查看当前runtime api的CUDA版本 还是古老的11.5版本,没办法啊,FlashAttention老是说不支持? 安装Torch时选择的CUDA版本 p…...
Android图片加载框架Coil,Kotlin
Android图片加载框架Coil,Kotlin implementation("io.coil-kt:coil:1.4.0") import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import coil.Coil i…...
Win11下搭建Kafka环境
目录 一、环境准备 二、安装JDK 1、下载JDK 2、配置环境变量 3、验证 三、安装zookeeper 1、下载Zookeeper安装包 2、配置环境变量 3、修改配置文件zoo.cfg 4、启动Zookeeper服务 4.1 启动Zookeeper客户端验证 4.2 启动客户端 四、安装Kafka 1、下载Kafka安装包…...
从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓
作者:羿莉(萧羿) 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型,以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1,而且在推理模型的成本优化上实现了突破…...
模拟(典型算法思想)—— OJ例题算法解析思路
目录 一、1576. 替换所有的问号 - 力扣(LeetCode) 运行代码: 1. 输入和输出 2. 变量初始化 3. 遍历字符串 4. 替换逻辑 5. 返回结果 整体分析 1. 思路总结 2. 为什么要这样设计 3. 时间复杂度与空间复杂度 4. 边界情况 二、495. 提莫攻击 - 力扣(LeetCode) …...
pgsql最快的数据导入BeginBinaryImport
PostgreSQL 的 BeginBinaryImport 是 libpq(PostgreSQL 的 C 语言客户端库) 中的一个函数,用于高效实现二进制数据的大批量导入。以下是详细介绍及适用语言说明: BeginBinaryImport 的作用 功能 它是 PostgreSQL C 接口库…...
【进程与线程】如何编写一个守护进程
如何编写一个守护进程。我们首先需要理解守护进程是什么。守护进程是在后台运行的进程,通常没有控制终端,用于执行系统任务,比如服务器或者定时任务。 用户可能想创建一个长期运行的服务,比如Web服务器或者日志监控程序。 首先&a…...
Docker容器访问外网:启动时的网络参数配置指南
在启动Docker镜像时,可以通过设置网络参数来确保容器能够访问外网。以下是几种常见的方法: 1. 使用默认的bridge网络 Docker的默认网络模式是bridge,它会创建一个虚拟网桥,将容器连接到宿主机的网络上。在大多数情况下,使用默认的bridge网络配置即可使容器访问外网。 启动…...
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
DeepSeek神经网络:技术架构与实现原理探析
以下是一篇关于DeepSeek神经网络的研究及实现原理的综述性文章,结合其技术架构、训练范式及创新点展开分析: 1. 核心架构设计 DeepSeek的神经网络架构以**混合专家模型(Mixture of Experts, MOE)**为基础,结合轻量化…...
KTOR:高效的Linux横向移动与无文件落地HTTP服务扫描工具
地址:https://github.com/MartinxMax/KTOR 简介 KTOR 是一款专为 Linux 横向渗透设计的工具。通过该工具,您可以快速扫描内部 HTTP 服务,以便进一步进行网络渗透,且实现无文件落地扫描。 在CTF中通常需要利用本地其他端口HTTP服务或其他主…...
C++ Primer 类型转换
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
2025新的一年网络营销推广该怎么干?
2025年,全球网民数量预计突破60亿,但流量红利消退、用户注意力稀缺、技术迭代加速……企业网络营销正面临前所未有的“生存战”。如何在竞争中突围?小马识途营销机构基于十五年实战经验,总结出2025年企业必须抢占的五大核心战场&a…...
java实现Http请求方式的几种常见方式
背景 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。若是普通java工程推荐使用OkHt…...
安卓开发,底部导航栏
1、创建导航栏图标 使用系统自带的矢量图库文件,鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖,并点击Sync Now …...
Spring Boot中实现多租户架构
文章目录 Spring Boot中实现多租户架构多租户架构概述核心思想多租户的三种模式优势挑战租户识别机制1. 租户标识(Tenant Identifier)2. 常见的租户识别方式3. 实现租户识别的关键点4. 租户识别示例代码5. 租户识别机制的挑战数据库隔离的实现1. 数据库隔离的核心目标2. 数据…...
SpringBoot源码解析(十):应用上下文AnnotationConfigServletWebServerApplicationContext构造方法
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...
vue3+vite全局loading
vue3vite全局loading j-loading.vue组件 <template><transition enter-active-class"animate__animated animate__fadeIn"leave-active-class"animate__animated animate__fadeOut"><div class"root-box" v-if"show"…...
比亚迪发布智能化战略,天神之眼开创全民智驾
2月10日,比亚迪在深圳隆重召开智能化战略发布会,正式向全球发布了其最新的智驾技术——“天神之眼”。这一技术的发布,标志着比亚迪在智能驾驶领域迈出了坚实的一步,稳居行业第一梯队,真正实现了端到端的智能驾驶体验&…...
在 MySQL 中,通过存储过程结合条件判断来实现添加表字段时,如果字段已存在则不再重复添加
-- 创建存储过程 DELIMITER $$ CREATE PROCEDURE add_column(IN db_name VARCHAR(255),IN table_name VARCHAR(255),IN column_name VARCHAR(255),IN column_definition VARCHAR(255),IN column_comment VARCHAR(255) ) BEGINDECLARE column_exists INT;-- 检查字段是否存在SEL…...
UP-VLA:具身智体的统一理解与预测模型
25年1月来自清华大学和上海姚期智研究院的论文“UP-VLA: A Unified Understanding and Prediction Model for Embodied Agent”。 视觉-语言-动作 (VLA) 模型的最新进展,利用预训练的视觉语言模型 (VLM) 来提高泛化能力。VLM 通常经过视觉语言理解任务的预训练&…...
后端开发ThreadLocal简介
ThreadLocal是线程的局部变量,为每个线程单独提供一份存储空间,具有线程隔离的效果,只有线程内能获取到对应的值 客户端发起的每次请求都对应一个单独的线程 常用方法 public void set(T value) 设置当前线程局部变量值public T get() 返回…...
AI分支知识之机器学习,深度学习,强化学习的关系
机器学习,深度学习,强化学习的关系 这一篇文章我们来探讨下AI领域中机器学习(ML)、深度学习(DL)和强化学习(RL)的关系。 一、机器学习(ML):从数…...
微信小程序案例2——天气微信小程序(学会绑定数据)
文章目录 一、项目步骤1 创建一个weather项目2 进入index.wxml、index.js、index.wxss文件,清空所有内容,进入App.json,修改导航栏标题为“中国天气网”。3进入index.wxml,进行当天天气情况的界面布局,包括温度、最低温、最高温、天气情况、城市、星期、风行情况,代码如下…...
CPLD实现SPI通信
在 CPLD 中编写 SPI 程序时,需根据具体需求(主/从设备、时钟极性、数据位宽等)设计逻辑。以下提供一个 SPI 主控制器的 Verilog 实现示例,支持 模式 0(CPOL=0, CPHA=0),适用于控制外设(如 ADC、DAC、存储器等)。 SPI 主控制器模块设计(Verilog) 模块功能 支持 8/16…...
FFmpeg + OpenGL ES 美颜相机教程大纲
做OpenGL和FFmpeg也有很长一段时间了,最近打算结合FFmpegOpenGL ES做一期视频教程,下面是完整视频教程大纲。最终的项目实战效果是实现一款美颜相机。教程分为理论讲解和实战开发两部分,适合有一定编程基础的开发者。课程计划是免费发布在B站…...
dynamic_cast和static_cast和const_cast
dynamic_cast 在 C 中的作用 dynamic_cast 是 C 运行时类型转换(RTTI, Run-Time Type Identification)的一部分,主要用于: 安全的多态类型转换检查类型的有效性向下转换(Downcasting)跨类层次的指针或引用…...
SQLMesh系列教程-2:SQLMesh入门项目实战
假设你已经了解SQLMesh是什么,以及其他应用场景。如果没有,我建议你先阅读《SQLMesh系列教程-1:数据工程师的高效利器-SQLMesh》。 在本文中,我们将完成一个小项目或教程,以帮助你开始使用SQLMesh。你可以选择一步一步…...
window 安装GitLab服务器笔记
视频: windows下内网本地部署gitlab 资源: Linux CeneOS7: CentOS7 镜像下载地址 VMware: 虚拟机17.6下载地址 安装vim编辑器 yum install vim -y系统环境升级(我第一次没有使用。第二次成功使用了的)…...
【逆向工程】破解unity的安卓apk包
先了解一下普通apk包的逆向方法(无加密或加壳) 开发环境: 操作系统:windows 解apk包 下载工具:apktool【Install Guide | Apktool】按照文档说的操作就行,先安装java运行时环境【我安装的是jre-8u441-wind…...
2021版小程序开发5——小程序项目开发实践(2)-完
2021版小程序开发5——小程序项目开发实践(2) 学习笔记 2025 使用uni-app开发一个电商项目继续; 过滤器的使用 filters: {toFixed(num){return Number(num).toFixed(2)} }<!-- 通过管道符 | 使用过滤器 --> <view> {{ item.price | toFixed }}</vi…...
Spring Boot牵手Redisson:分布式锁实战秘籍
一、引言 在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务…...
【HarmonyOS Next 自定义可拖拽image】
效果图: 代码: import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…...
基于扑克牌分发效果制作时的问题总结
其基本效果如图 1. 在overlay模式下直接使用position来移动 实现代码 public class Card : MonoBehaviour {public RectTransform target;public Button cardButton;private bool isPack false;public List<RectTransform> cards new List<RectTransform>(…...
为多个GitHub账户配置SSH密钥
背景 当需要同时使用多个GitHub账户(例如工作和个人账户)时,默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对,并指…...
三步本地部署deepseekr1,支持macOs,ubuntu,Windows
一、ollama安装: ollama官网:Ollama Ollama 是一款支持在 Windows、macOS 和 Linux 上本地运行大型语言模型的工具。以下是针对不同操作系统的安装指南: 1、Windows 系统 下载安装包:访问 Ollama 官方下载页面,选择适用于 Windows 的安装包进行下载。 运行安装程序:下…...
STM32 HAL库 CANbus通讯(C语言)
#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...
Cotex-M系列介绍
一、芯片设计公司——ARM ARM公司:只做内核设计和IP授权,不参与芯片设计 二、Cortex内核分类及特征...
测试自动化落地方向
一、视觉回归自动化测试(低成本高回报) 痛点: UI 频繁迭代导致视觉问题难覆盖 方案: 引入Applitools或SikuliX做视觉比对(无需维护元素定位) 关键路径截图比对,自动检测 UI 错位/样式问题 亮点…...
如何通过优化网站结构提高SEO效果?
很多人以为,SEO就是写写关键词,发点外链,但其实,网站结构才是排名的地基!你可以把网站想象成一栋房子,框架没搭好,装饰再漂亮也没用,迟早会塌。同样的道理,如果网站结构混…...
迅雷下载的原理和使用协议的分析
迅雷作为一款广泛使用的下载工具,其核心原理是通过整合多种下载协议和资源分发技术来提升下载速度。以下是对其原理及协议的详细分析: 一、迅雷下载的核心原理 多协议混合下载(P2SP) P2SP(Peer-to-Server-Peer…...
RPA与深度学习结合
什么是RPA RPA即机器人流程自动化(Robotic Process Automation),它是一种利用软件机器人模拟人类在计算机上的操作,按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...