Oracle 深入理解Lock和Latch ,解析访问数据块全流程
Oracle 锁机制介绍
根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类: DML lock(data locks,数据锁):用于保护数据的完整性; DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如 表、视图、索引的结构定义); internal locks,latches,mutex,pin:保护内部数据库结构;Oracle DML锁共有两个层次,即行级锁(TX)和表级锁(TM)。
一 .Lock 锁
1.锁介绍
我们在谈到性能优化的时候,通常是讲系统缓慢的时候需要性能优化,系统缓慢通常是由什么原因导致的呢?大概上讲分为两种
- 系统的资源耗尽了(cpu耗尽了,IP,吞吐量上不去)性能枯竭,性能达到了极限。
- 锁定,阻塞,发现系统性能很高,但应用程序性能就是上不去,这种情况通常来讲是阻塞。
模拟锁的情况:
窗口一:建一张表,插入一条数据,id上有主键
窗口二:再往这张表id列插入一条同样的数据
由于primary key本质上是 unique key + not null ,由于第二个事务不知道第一个事务是提交还是回滚,如果提交则事务二插入失败,如果回滚则插入成功,此时会造成锁阻塞。
窗口一:
窗口二:
2.Oracle中锁的大体分类
Enqueues : 队列类型的锁,通常和业务相关的锁。
Latches: 系统资源方面的锁,比如内存结构,SQL解析等
锁的所有类型可以根据视图v$lock_type 查看
环境oracle 19c 共291种 锁。
.........
3.锁的原则
- 只有被修改时,行才会被锁定。
- 当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。
- 当某行被修改时,它将阻塞别人对它的修改。
- 当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。
- 读永远不会阻止写。
- 读不会阻塞写,但有唯一的一个例外,就是select …for update。
- 写永远不会阻塞读。
- 当一行被修改后,Oracle通过回滚段提供给数据的一致性读。
这里其实听过其它很多人说过Oracle锁升级的概念,根据一下Oracle资料调查Oracle不存在锁升级,但确实存在锁转换。
数据库在必要时执行锁转换。在锁转换中,数据库自动将较低限制的表锁转换为较 高限制的其它锁定。(锁转换不同于锁升级,锁升级发生在当某个粒度级别持有许多锁(例如行),数据库将其提高到更高粒度级别(例如表)Oracle数据库永远不会升级锁。
Oracle的锁是block里面实现的,(SQLSERVER、DB2是内存里面实现的。内存实 现有资源消耗问题,当内存不足会引发锁升级)但是Oracle不会发生锁升级。
事务拥有在此事务内被插入(insert)、更新(update)、删除(delete)的数 据行的排它行级锁(exclusive row lock)。对于数据行来说,排它行级锁已经是 限制程度最高的锁,因此无需再进行锁转换(lock conversion)。
4.TM锁和TX锁
- TM表锁,发生在insert,update,delete以及select for update操作时,目的是保证操 作能够正常进行,并且阻止其它人对表执行DDL操作。
- TX锁事务锁(行锁)对于正在修改的数据,阻止其它会话进行修改。
根据官方文档归纳总结: v$lock视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下:
v$locked_object视图列出当前系统中哪些对象正被锁定,其主要字段说明如下:
inert 锁过程验证:
窗口一:
窗口二:
查看锁结构:
在整个过程中
- 首先会话58 对表T 加TM(表锁 )和TX(行锁),TM锁的BLOCK = 1 代表这个会话在阻塞其它会话
- 第二个会话273 也对T表加了一个TM(表锁),又加了一个TX(行锁),这个行锁request = 4,代表它正在被阻塞
- 中间那把锁(会话273的行锁)正在请求锁并且被会话58的行锁阻塞。会话58持有的行锁(
LMODE = 6
)正在阻塞会话273对相同行的访问,导致会话273的请求(REQUEST = 4
)被阻塞。
update锁过程验证:
窗口一:
窗口二:
查看锁过程:
整个过程
会话53 对表T加TM和TX锁,TX锁阻塞了其它会话,会话273对表T 加TM和TX锁,TX锁request=6 被阻塞。
delete 锁过程验证:
窗口一:
窗口二:
查看锁过程:
会话58对表T加表锁和行锁,会话273对表T加表锁和行锁,58的行锁阻塞了273的行锁。
从v$session_wait 查看阻塞详情(从会话层面查看锁阻塞):
所以TX锁又叫队列锁(enq锁)
TM锁的几种模式:
ORACLE里锁有以下几种模式: |
TM锁几种模式的互斥关系:
模式 | 锁定的SQL | 排斥的模式 | 允许的DML |
2 | lock table t in row share mode | 6 | select, insert, update, delete, for update |
3 | lock table t in row exclusive mode | 4,5,6 | select, insert, update, delete, for update |
4 | lock table t in share mode | 3,5,6 | select |
5 | lock table t in share row exclusive mode | 3,4,5,6 | select |
6 | lock table t in exclusive mode | 2,3,4,5,6 | select |
5..RI锁 - 基于 引用关系的锁
当对具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表上也可能加上相应的锁定
示例:
insert 操作在往主表注入一条数据的时候会在主表和从表上同时上TM锁,对主表上TX锁
update 操作 只会在主表上加TM和TX锁
6.死锁
两个会话互相持有对方资源导致死锁 (Oracle 会自动检测死锁)
会话一:
会话二:
如上,Oracle自动检测到了死锁,释放了会话一。
二 .Latch 锁(闩锁)
用中国话理解闩,就是古代插在门后面那个上锁的。(意味着获取一个资源之后,把它插住,谁也用不了,用完之后再把它打开)
Latch和Lock的区别:
Lock 可以想象成食堂排队打饭,是有序的。
Latch可以想象成微信群里抢红包,抢红包不是一个一个排队的抢,是无序的。而就因为Latch的无序性,才需要Latch锁
Latch | Lock | |
队列性 | 无序 | 有序 |
时长 | 很短 | 可能很长 |
层面 | 数据库资源层 | 业务应用层 |
目的 | 保护资源的完整性 | 保证业务操作的完整性 |
Latch的目的
-
保证资源的串行访问: -保护SGA的资源访问 -保护内存的分配
-
保证执行的串行化: -保护关键资源的串行执行 -防止内存结构损坏
Latch在哪里 ->SGA
sharedpool -sql解析,sql重用....... buffercache -数据访问,数据写入磁盘,数据读入内存,修改数据块,数据段扩展
oracle19c 共993个Latch
Latch的的获取:
wait方式--如果无法获取请求的latch ,则:
-spin
当一个会话无法获得需要的latch时,会继续使用CPU( CPU空转),达到一个间隔后, 再次尝试申请latch ,直到达到最大的重试次数。
-sleep
当一个会话无法获得需要的latch时,会等待一段时间(sleep) ,达到 Y间隔后,再次 尝试申清latch,如此反复,直到达到最大的重试次数。
No wait方式--如果无;标取请求的latch ,则:
-不会发生sleep或者spin.
-转而去获取其它可用的Latch
Latch锁在data buffer中的应用
data buffer存在的意义就是为了在内存中进行高速的数据查找和更新,尽量减少磁盘的IO操作, Buffer Cache中存在一个Hash Bucket结构,将数据库中已经读取的数 据块放到里面,在从数据库文件中读取到一个数据块后,Oracle会根据这个数据块的 文件编号,段编号,数据块号组合到一起通过一个内部的hash算法运算后,会放到不同 的hash bucket中,每个Hash Bucket都有一个Hash chain list,保留Buffer Header 中的信息,然后通过这个list,把相同hash值的Buffer串起来.结构如图:
为保护这个结构不受同步更新的破坏,Oracle设计了一个CBC latch的锁结构 (Cache Buffers Chains),一个latch保护32的桶(Bucket),所以为了访问hash列表, 必须先获得CBC Latch.先获取Latch后,在对Buffer进行操作.对buffer操作是一个比较耗时的操作,比如从磁盘读取block。由于一个latch管理 32个桶,所以对buffer操作时不能继续持有latch。Oracle使用两阶段加latch锁的 方式解决这个问题。
- 加latch锁
- 查找buffer,并对buffer加pin锁,如果是读取操作则为shared pin,若是写操 作,则exclusive pin
- 释放latch锁
- 对buffer进行操作
- 加latch锁
- 释放pin锁
- 释放latch锁
参见下图,一个buffer拥有一个pin锁,每个pin锁对应两个列表,user's list(拥有 锁的用户列表)和waiter's list(等待锁的列表),如果用户等待pin锁的时间超过1 秒,则认为出现死锁。buffer和pin锁是 一 一对应关系
加上锁保护以后,整体的图
所以读取数据块的过程如下,当一个用户进程想要访问一个数据块:
- 根据数据文件号,块号生成hash 值
- 在Hash Table中找到bucket地址
- 获取CBC latch,一个latch保护32个bucket
- bucket有一个指针指向bh(buffer head)
- 根据bh的搜索链表
- 匹配bh里面的内容和要找的
- 匹配到一个bh,给bh加锁buffer pin(共享和独占)
- 释放cbc latch, cbc latch做两件事情:保护链表,保护加buffer pin锁
- 进程根据bh里面的ba地址找内存块
- 找完了,获得cbc latch,在保护下 释放buffer pin锁
利用哈希表管理已经被缓存的data block。为了使得哈希桶上链表尽量短,理想目 标是一个链表上最多只有一个buffer,哈希桶的数量一般是data buffer数量的两 倍,并把桶分组,每个组对应一个latch,latch用来保护桶中的链表。一个latch保 护32个桶。
虽然和lock相比,latch是轻量级的,但是使用latch也是有比较大的开销的,所以 oracle尽量减少latch数量,所以一个latch管理了高达32个桶。
Oracle 等待事件 latch free:
如:
Oracle事件latch free定义为:当多个进程竞争一个latch 2次,而第2次的竞争者失败时,在 Statspack 或ASH报告中可以看到的Oracle事件名称。 当数据库发生IO瓶颈,并且出现这类事件时,就可以查看latch free对Oracle性能的影响。
latch free 是一种 Oracle 的内部技术,是用于提升性能的一种需要得到保护的数据结构。 通俗讲,在有多个几秒之间,用来竞争访问相同的资源的多个进程中,如果短时间内无法访问此特定资源,则会发生latch free事件。
由于Oracle数据库中大量组件都是由不同的进程驱动的,每一个进程都可以同时访问资源,并产生latch free的。 而我们的目的是保护共有的资源,因此在资源访问时,可能会出现竞争的情况。 在竞争时,如果第二个进程竞争失败,则表示该进程无法获取资源,这就引发了latch free事件。
解决方案:首先查看 latch free 看看哪个类型latch 最多
select p1,p2,p3,inst_id,count(*) from gv$active_session_history where sample_time > sysdate-1/24 and event='latch free' group by p1,p2,p3,inst_id order by 5 desc;
Latch锁类型较多,需要根据不同类型的Latch 做不同的处理方案
快速查看当前Lock锁等待信息:
Oracle提供一个名为utllockt.sql的脚本,它会给出一个树形结构的锁等待图,显示持有影响其他会话的锁的会话。使用此脚本,可以看出一个会话正在等待什么锁,哪个会话持有这些锁。该脚本位于$ORACLE_HOME/rdbms/admin目录下。
@?/rdbmsa/admin/utllockt.sql
执行脚本可以迅速看到 会话51在请求一个Share锁,等待47释放Exclusive锁。
相关文章:
Oracle 深入理解Lock和Latch ,解析访问数据块全流程
Oracle 锁机制介绍 根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类: DML lock(data locks,数据锁):用于保护数据的完整性; DDL lock(dictionary locks,字典…...
Django Admin: 动态合并数据库和预定义选项的高级过滤器实现
在 Django 管理界面中,我们经常需要为某些字段提供过滤选项。通常情况下,这些选项要么是预定义的,要么是从数据库中动态获取的。但是,有时我们需要更灵活的解决方案:当数据库为空时使用预定义选项,而当数据库有数据时,则合并预定义选项和数据库中的值。本文将详细介绍如…...
Linux文件系统
理解硬件 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯一的一个机械设备 磁盘--- 外设,慢,容量大,价格便宜 磁盘物理结构 扇区是从磁盘读出和写入信息的最小单位,通常大小为 512 字节。磁头(head)数&a…...
C++标准库——时间
文章目录 chrono库durationtime_pointclocks C 风格日期和时间库参考 C 支持两种类型的时间操作: Chrono库,在chrono头文件中提供C 风格日期和时间库,std::time这种,在ctime头文件中提供 chrono库 在<chrono>中࿰…...
AutoGen 技术博客系列 八:深入剖析 Swarm—— 智能体协作的新范式
本系列博文在掘金同步发布, 更多优质文章,请关注本人掘金账号: 人肉推土机的掘金账号 AutoGen系列一:基础介绍与入门教程 AutoGen系列二:深入自定义智能体 AutoGen系列三:内置智能体的应用与实战 AutoGen系列四&am…...
【系统架构设计师】操作系统的分类
目录 1. 说明2. 批处理操作系统3. 分时操作系统4. 实时操作系统5. 网络操作系统6. 分布式操作系统7. 微型计算机操作系统8.嵌入式操作系统9.例题9.1 例题1 1. 说明 1.通常,操作系统可分为批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统…...
25林业研究生复试面试问题汇总 林业专业知识问题很全! 林业复试全流程攻略 林业考研复试真题汇总
25 林业考研复试,专业面试咋准备?学姐来支招! 宝子们,一提到林业考研复试面试,是不是就慌得不行,感觉老师会扔出一堆超难的问题?别怕别怕,其实林业考研复试就那么些套路,…...
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式,因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作,分别是管理员、教师和学生。教师在系统后台新增试题和试卷,学生进行在线考试,还能对考生记录、错题…...
常用高压缩率的视频容器格式,并进行大比例压缩
常用的高压缩率视频容器格式,包括*.mp4 、*.mkv、*.webM等。 容器格式本身并不直接决定压缩率,而是取决于容器中所使用的视频编码格式等因素。不过,在常见的视频容器格式中,一些容器在搭配特定编码格式时,通常能表现出较高的压缩效率,以下是相关介绍: 1 MKV格式 …...
请说明C#中的List是如何扩容的?
在 C# 中,List<T>是一个动态数组,它会根据需要自动调整其容量以容纳更多的元素。 目录 1 扩容条件与扩容算法规则 2 总结 1 扩容条件与扩容算法规则 当你创建一个新的List<T>实例时,如果没有指定初始容量,它会使…...
《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成
量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…...
使用AI创建流程图和图表的 3 种简单方法
你可能已经尝试过使用 LLMs 生成图像,但你有没有想过用它们来创建 流程图和图表?这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常,在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗?你可以使用 LLMs 通过简…...
数字后端实现之Innovus中open net原因解析及解决方案
数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...
【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…...
vue 学习-vite api.js
/** 整机管理 * */ // 整机分类 列表 export const wholeMachineServersType params > ajaxGet({url: wholeMachine/serverstype/,params}) // 整机分类 新增 export const wholeMachineServersTypeAdd params > ajaxPost({url: wholeMachine/serverstype/,params}) /…...
Unity贴图与模型相关知识
一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图(但并不规范) 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB:勾选此选项代表此贴图存储于Gamma空间中…...
Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路
引言:Elasticsearch——数据世界的“福尔摩斯” 大家好,今天我们要聊的是一个在数据世界中扮演“福尔摩斯”角色的工具——Elasticsearch。如果你曾经为海量数据的搜索和分析头疼不已,那Elasticsearch就是你的救星!它不仅能帮你快…...
更改visual studio 2022 默认NuGet包路径
本文章仅提供更改用户级别的NuGet包默认路径的更改,电脑级别的更改需要更改%ProgramData%\NuGet\Config\machine.config, 而且需要管理员权限,但是更改内容类似用户级别的NuGet更改。 1. 关闭VS 2. 打开NuGet配置文件路径 可通过以下两种方…...
什么是超越编程(逾编程)(元编程?)
超越编程(逾编程)(元编程?)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素,其有三种含义ÿ…...
深入理解设计模式之解释器模式
深入理解设计模式之解释器模式 在软件开发的复杂世界中,我们常常会遇到需要处理特定领域语言的情况。比如在开发一个计算器程序时,需要解析和计算数学表达式;在实现正则表达式功能时,要解析用户输入的正则表达式来匹配文本。这些场景都涉及到对特定语言的解释和执行,而解…...
用户体验测试
引言 在数字化时代,用户体验(UX)是衡量产品成功与否的关键指标之一。它不仅关乎产品的功能和性能,更涉及用户在使用过程中的情感反应和信任建立。作为软件测试专家,深入理解并实践用户体验测试是确保产品竞争力的关键。…...
51单片机-串口通信编程
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下: 确定T1的工作方式(编程TMOD寄存器)计算T1的初值,装载TH1\TL1启动T1(编程TCON中的TR1位…...
论文略读:Uncovering Hidden Representations in Language Models
202502 arxiv 说一下主要结论吧 对于下游任务,语言模型的中间层在所有架构和任务中始终优于最后一层 这挑战了使用最后一层表示的传统观点。 不同的架构表现出不同的信息压缩模式。自回归模型在中间层存在瓶颈,而双向模型则保持更均匀的趋势 BERT通过双…...
正确清理C盘空间
一.系统清理 正确清理C盘空间主要是删除不需要的文件和应用程序,以释放磁盘空间。以下是一些常用的方法: 删除临时文件:在Windows搜索框中输入“%temp%”,打开临时文件夹,将其中的文件全部删除。 清理回收站…...
数据表的存储过程和函数介绍
文章目录 一、概述二、创建存储过程三、在创建过程中使用变量四、光标的使用五、流程控制的使用六、查看和删除存储过程 一、概述 存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可…...
IntelliJ IDEA 控制台输出中文出现乱码
IntelliJ IDEA 控制台输出中文出现乱码通常是由于编码设置不一致导致的。以下是常见原因及解决方法 1. 项目编码设置 检查路径:File → Settings → Editor → File Encodings 确保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…...
ARMS 助力假面科技研发运维提效,保障极致游戏体验
客户介绍与项目背景 假面科技成立于 2014 年,致力于打造创新的数字产品,火爆一时的“狼人杀”、“谁是卧底”、“足记相机”都是假面科技旗下产品,公司产品总数超过 40 款,覆盖用户数超过 2 亿人。 随着业务的持续发展ÿ…...
go json处理 encoding/json 查询和修改gjson/sjson
推荐 标准库encoding/json import ("encoding/json""log" )// Student1 注意点: // 1. 注意alain别名的写法: json:"name1" 而非 "json:name1" // 2. 注意json.Marshal的时候只输出首字母大写的属性 // 3. jso…...
Web Worker终极优化指南:4秒卡顿→0延迟的实战蜕变
💡 导读:从4秒卡顿到丝滑响应 真实痛点场景:当斐波那契数列计算量达10亿次时,页面完全冻结4.2秒!通过Web Worker优化后,UI响应时间降至16ms以内。本文手把手带您实现性能蜕变! 一、Web Worker核…...
python读取pdf文档
import io import pdfplumber from opencc import OpenCC import fitz # pymupdf import osfile_path /document/pdf/xxx.pdf output_dir /classification/pdf/images #获取图片 demo def extract_images_from_pdf(pdf_path, output_dir):# 确保输出目录存在if not os.path.…...
CSS垂直居中终极方案:告别复杂计算,拥抱现代布局
CSS垂直居中终极方案:告别复杂计算,拥抱现代布局 📌 前言:为什么垂直居中如此重要?一、2024年最推荐的3种方案1. Flexbox布局(首推方案)2. Grid布局(未来趋势)3. Transfo…...
ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置
视频讲解 ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置 创建 ROS 2 包 进入工作空间的 src 目录,然后创建一个新的 Python 包: ros2 pkg create --build-type ament_python panda_joint_control --dependencies rclpy control_msgs…...
SHELL32!Shell_MergeMenus函数分析
SHELL32!Shell_MergeMenus函数分析 UINT Shell_MergeMenus( [in] HMENU hmDst, [in] HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags ); 参数 [in] hmDst 类型: HMENU 要向其添加 hmSrc…...
python: SQLAlchemy (ORM) Simple example using SQLite
领域层(Domain Laye):定义了 School 实体类和 SchoolRepository 抽象基类,明确了业务实体和数据访问的契约。 基础设施层(Infrastructure Laye):通过 SQLAlchemy 实现了 SchoolRepository 类&am…...
MySQL 视图入门
一、什么是 MySQL 视图 1.1 视图的基本概念 在 MySQL 中,视图是一种虚拟表,它本身并不存储实际的数据,而是基于一个或多个真实表(基表)的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询…...
【洛谷排序算法】P1012拼数-详细讲解
这道题本质上是通过确定数字的拼接顺序来得到最大拼接数,虽然主要思路是利用字符串及其比较规则来实现,但也可以基于数组结合一些转换操作来解决,以下是大致思路和代码示例: 【算法思路】 首先将输入的数字存储在数组中。然后自…...
在WPS中设置word的页码不从第一页开始,从指定页开始插入页码
大家好,我是小鱼。 在日常的办公中为Word文档页面插入页码是经常要做的。如果一个文档有几十页,插入页码不仅可以快速定位到文章的内容,如果需要制作目录也方便制作。正确情况下插入页码都是从第一页开始的,但是有些文档比如说标…...
鸿蒙app 开发中 对于数组方法 filter 的理解
这段代码是 TypeScript 中数组 filter 方法的类型定义,下面将详细解释其各个部分的含义、作用及使用场景。 整体功能概述 filter 方法是 JavaScript 和 TypeScript 中数组对象的一个内置方法,它的主要功能是创建一个新数组,新数组中的元素是…...
【废物研究生刷算法】字符串
文章目录 1. 反转字符串2. 替换数字3. 反转字符串中的单词4. 右旋字符串总结1、字符串处理函数2、字符串切片 如果使用python处理字符串,有很多py内置的函数可以使用,主要还是记住这些处理方法。 1. 反转字符串 class Solution:def reverseStr(self, s, …...
深入理解 SQL 注入漏洞及解决方案
一、引言 在当今数字化时代,数据库作为存储和管理数据的核心组件,其安全性至关重要。SQL 注入是一种常见且极具威胁性的数据库安全漏洞,它可能导致数据泄露、篡改甚至系统被完全控制。本文将深入探讨 SQL 注入漏洞的产生原因、表现形式以及如…...
Next.js 学习-1
Next.js学习 引用:https://www.nextjs.cn/learn/basics/create-nextjs-app 先试试水吧,正好dify用的这个构建的前端项目。 使用 如果您尚未安装 Node.js,请 从此处安装。要求 Node.js 10.13 或更高版本。 好吧得用新的了,记得…...
[ComfyUI]Recraft贴图开源方案,实现服装印花自由
一、介绍 今天发现了一个简单又好用的插件,可以实现类似Recraft的贴图功能,这是一个作者开发的ComfyUI插件,叫做Comfyui-Transform 这个插件比我们简单的图像覆盖多了一些可控参数,形状、透明度、倾斜、拉升和混合模式等诸多可控…...
JavaScript 数组连接方法
在 JavaScript 中,有多种方法可以连接数组。每种方法都有其自身的优点和缺点。常见的方法包括 concat()、扩展运算符(...)、push()、splice()、slice()、join()、forEach()、reduce() 以及 Array.from() 等。下面是这些方法的详细说明和示例代码。 1. concat() co…...
Windows安装MySQL教程
1.下载 下载地址:https://www.mysql.com/downloads/ 下载版本:MySQL Installer for Window 2.安装MySQL 以下只列出需要注意的一些界面,没出现的界面默认继续即可。 1.选择安装类型 提供了多种安装模式,包括默认开发版、仅…...
VOS3000线路对接、路由配置与路由分析操作教程
一、VOS3000简介 VOS3000是一款常用的VoIP运营平台,支持多种线路对接和路由配置,适合新手快速上手。本教程将带你了解如何对接线路、配置路由以及进行路由分析。 二、线路对接 准备工作 获取线路信息:从供应商处获取线路的IP地址、端口、用…...
PiscTrace的开发者版
基于 PiscTrace 架构的视图处理的纯开发板,支持静态图片、实时视频流、摄像头视频流和网络视频流的处理。与 PiscTrace 应用版相比,开发者版通过直接的代码开发,提供了更高的灵活性和可定制性,适用于需要深度定制和复杂处理的应用…...
OnlyOffice:前端编辑器与后端API实现高效办公
OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…...
github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新
1.github上新建一个repository 设置为private tips删除在这 点setting 然后往下拖动 会有个这里是用来删项目的 2.另外 一台电脑拉取这个repository的时候 需要配置 一个ssh key 这个key的内容生成参考本地电脑的生成 然后在这配置 2.1 生成 SSH 密钥(如果还没有…...
本周行情——250222
本周A股行情展望与策略 结合近期盘面特征及市场主线演化,本周A股预计延续结构性分化行情,科技成长与政策催化板块仍是资金主战场,但需警惕高标股分歧带来的波动。以下是具体分析与策略建议: 1. 行情核心驱动因素 主线延续性&…...
分发糖果(力扣135)
题目说相邻的两个孩子中评分更高的孩子获得的糖果更多,表示我们既要考虑到跟左边的孩子比较,也要考虑右边的孩子,但是我们如果两边一起考虑一定会顾此失彼。这里就引入一个思想:先满足右边大于左边时的糖果分发情况,再…...