【MySQL】 MySQL 死锁问题分析优化器特性及优化方案
MySQL 死锁问题分析优化器特性及解决方案
MySQL 锁机制介绍
1、MySQL常用存储引擎的锁机制
MyISAM和MEMORY采用表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
2、各种锁特点
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
3、各种锁的适用场景
表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用
行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统
4、死锁
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.
MySQL 死锁问题分析优化
1、问题现象
INSERT 并发死锁问题的文章。一个具体案例如下:
研发反馈应用发生死锁,收集如下诊断内容:
LATEST DETECTED DEADLOCK
2023-07-04 06:02:40 0x7fc07dd0e700
*** (1) TRANSACTION:
TRANSACTION 182396268, ACTIVE 0 sec fetching rows
mysql tables in use 1, locked 1
LOCK WAIT 21 lock struct(s), heap size 3520, 2 row lock(s), undo log entries 1
MySQL thread id 59269692, OS thread handle 140471135803136, query id 3738514953 192.168.0.215 user1 updating
delete from ltb2 where c = ‘CCRSFD07E’ and j = ‘Y15’ and b >= ‘20230717’ and d != ‘1’ and e != ‘1’
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 603 page no 86 n bits 248 index PRIMARY of table testdb
.ltb2
trx id 182396268 lock_mode X locks rec but not gap waiting
*** (2) TRANSACTION:
TRANSACTION 182396266, ACTIVE 0 sec fetching rows, thread declared inside InnoDB 1729
mysql tables in use 1, locked 1
28 lock struct(s), heap size 3520, 2 row lock(s), undo log entries 1
MySQL thread id 59261188, OS thread handle 140464721291008, query id 3738514964 192.168.0.214 user1 updating
update ltb2 set f = ‘0’, g = ‘0’, is_value_date = ‘0’, h = ‘0’, i = ‘0’ where c = ‘22115001B’ and j = ‘Y4’ and b >= ‘20230717’
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 603 page no 86 n bits 248 index PRIMARY of table testdb
.ltb2
trx id 182396266 lock_mode X locks rec but not gap
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 603 page no 86 n bits 248 index PRIMARY of table testdb
.ltb2
trx id 182396266 lock_mode X locks rec but not gap waiting
*** WE ROLL BACK TRANSACTION (1)
以上 space id 603 page no 86 n bits 248,其中 space id 表示表空间 ID,page no 表示记录锁在表空间内的哪一页,n bits 是锁位图中的位数,而不是页面偏移量。记录的页偏移量一般以 heap no 的形式输出,但此例并未输出该信息。
基本环境信息
确认如下问题相关信息:
数据库版本:Percona MySQL 5.7
事务隔离级别:Read-Commited
表结构和索引:
CREATE TABLE ltb2
(
ID
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘ID’,
j
varchar(16) DEFAULT NULL COMMENT ‘’,
c
varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘’,
b
date NOT NULL DEFAULT ‘2019-01-01’ COMMENT ‘’,
f
varchar(1) NOT NULL DEFAULT ‘’ COMMENT ‘’,
g
varchar(1) NOT NULL DEFAULT ‘’ COMMENT ‘’,
d
varchar(1) NOT NULL DEFAULT ‘’ COMMENT ‘’,
e
varchar(1) NOT NULL DEFAULT ‘’ COMMENT ‘’,
h
varchar(1) NOT NULL DEFAULT ‘’ COMMENT ‘’,
i
varchar(1) DEFAULT NULL COMMENT ‘’,
LAST_UPDATE_TIME
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间’,
PRIMARY KEY (ID
),
UNIQUE KEY uidx_1
(b
,c
)
) ENGINE=InnoDB AUTO_INCREMENT=270983 DEFAULT CHARSET=utf8mb4 COMMENT=‘’;
关键信息梳理
事务 T1
语句 delete from ltb2 where c = ‘code001’ and j = ‘Y15’ and b >= ‘20230717’ and d != ‘1’ and e != ‘1’
关联对象及记录 space id 603 page no 86 n bits 248 index PRIMARY of table testdb.ltb2
持有的锁 未知
等待的锁 lock_mode X locks rec but not gap waiting
事务 T2
语句 update ltb2 set f = ‘0’, g = ‘0’, is_value_date = ‘0’, h = ‘0’, i = ‘0’ where c = ‘22115001B’ and j = ‘Y4’ and b >= ‘20230717’
关联对象及记录 space id 603 page no 86 n bits 248 index PRIMARY of table testdb.ltb2
持有的锁 lock_mode X locks rec but not gap
等待的锁 lock_mode X locks rec but not gap waiting
可以看到在主键索引上发生了死锁,但是在查询的条件中,并未使用主键列。
那为什么会在主键列出现死锁? 在分析死锁根因问题前,需要先清楚 SQL 的执行情况。
2、SQL 执行情况
执行计划
以上两个 SQL 发现都有列 b、c 作为条件,且该列构成了索引唯一索引 uidx_1。简化 SQL 改为查询语句,并确认执行计划:
mysql> desc select * from ltb2 where b >= ‘20230717’ and c = ‘code001’;
#部分结果
±---- -±------------------±-----±--------+
| type | possible_keys | key | Extra |
±---- -±------------------±-----±--------+
| ALL | uidx_1 | NULL | Using where |
±---- -±------------------±-----±--------+
注意:自 MySQL 5.6 开始可以直接查看 UPDATE/DELETE/INSERT 等语句的执行计划。因个人习惯、避免误操作等原因,还是习惯改为 SELECT 查看执行计划。
执行计划中可能的索引有 uidx_1(b,c),但实际并未使用该索引,而是采用全表扫描方式执行。
根据经验,由于列 b 为索引的最左列。但查询的条件为 b>= ‘20230717’,即该条件不是等值查询。因此数据库可能只能“使用”到 b 列。为进一步确认不使用 b 列索引的原因,查询数据分布:
mysql> select count(1) from ltb2;
±-----------+
| count(1) |
±-----------+
| 4509 |
±-----------+
mysql> select count(1) from ltb2 where b >= ‘20230717’ ;
±-----------+
| count(1) |
±-----------+
| 1275 |
±-----------+
计算满足 b 列条件的数据占比为 1275/4509 = 28%,占比差不多达到了 1/3。此时也的确不应使用该使用索引。
难道已经是作为 MySQL 5.7 的数据库,优化器还是这么简单?
ICP 特性
带着问题,将条件设置一个更大的值(但小于该列的最大值),再次执行验证查询语句:
mysql> desc select * from ltb2 where b >= ‘20990717’;
#部分结果
±---------±--------±--------+
| key_len | rows | Extra |
±---------±--------±--------+
| 3 | 64 | Using Index condition |
±---------±--------±--------+
优化器预估返回 64 行,数据占比 64/4509 = 1.4%,因此可以使用索引。但通过执行计划,从 Extra 列看到 Using index condition 提示。该提示则说明使用了索引条件下推(Index Condition Pushdown, ICP)。针对该特性,参考官方简要说明如下:
使用 Index Condition Pushdown,扫描将像这样进行:
获取下一行的索引元组(但不是完整的表行)。
测试 WHERE 条件中应用于此表的部分,并且只能使用索引列的进行检查。如果不满足条件,则继续到下一行的索引元组。
如果满足条件,则使用索引元组定位并读取整个表行。
测试适用于此表的 WHERE 条件的其余部分。根据测试结果接受或拒绝该行。
既然可以使用到 ICP 特性,进一步执行如下验证语句:
mysql> desc select * from ltb2 where b >= ‘20990717’ and c = ‘code001’;
#部分结果
±---------±--------±--------+
| key_len | rows | Extra |
±---------±--------±--------+
| 133 | 64 | Using Index condition |
±---------±--------±--------+
发现当新增 c 列作为条件后,并且根据 key_len(索引里使用的字节数)可以判断,的确使用到了 uidx_1 索引中的 c 列。但 rows 的结果与实际返回结果差异较大(实际执行仅返回 0 行)。
更重要的是,既然具有 ICP 特性,针对原始的 SQL 为什么不能助于 ICP 特性使用到索引呢?
mysql> select * from ltb2 where b >= ‘20230717’ and c = ‘code001’
执行计划跟踪
继续带着问题,通过 MySQL 提供的 OPTIMIZER TRACE,跟踪执行计划生成过程。命令如下:
SET OPTIMIZER_TRACE=“enabled=on”,END_MARKERS_IN_JSON=on;
SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;
– sql-1:
select * from ltb2 where b >= ‘20990717’ and c = ‘code001’;
– sql-2:
select * from ltb2 where b >= ‘20990717’;
– sql-3
select * from ltb2 where b >= ‘20230717’ and c = ‘code001’;
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE\G
SET optimizer_trace=“enabled=off”;
由于分析结果较长,截取 SQL-1 和 SQL-2 的部分结果 (rows_estimation 和 considered_execution_plans)。具体内容如下:
SQL-1
select * from ltb2 where b >= ‘20990717’ and c = ‘code001’
#分析结果
“analyzing_range_alternatives”:{
“range_scan_alternatives”:[
{
“index”:“uidx_1”,
“ranges”:[
“0xe76610 <= b”
] /* ranges /,
“index_dives_for_eq_ranges”: true,
“rowid_ordered”: false,
“using_mrr”: false,
“index_only”: false,
“rows”:64,
“cost”: 77.81,
“chosen”: true
}
] / range_scan alternatives */
}
“best_access_path”:{
“considered access_paths”:[
“rows_to_scan”: 64,
“access_type”:“range”,
“range_details”:{
“used index”;“uidx 1”
} /* range_details /,
“resulting_rows”: 64,
“cost”: 90.61,
“chosen”: true
}
] / considered access_paths /
} / best access_path */,
SQL-2
select * from ltb2 where b >= ‘20990717’
#分析结果
“analyzing_range_alternatives”:{
“range_scan_alternatives”:[
{
“index”:“uidx_1”,
“ranges”:[
“0xe76610 <= b”
] /* ranges /,
“index_dives_for_eq_ranges”: true,
“rowid_ordered”: false,
“using_mrr”: false,
“index_only”: false,
“rows”:64,
“cost”: 77.81,
“chosen”: true
}
] / range_scan alternatives */
}
“considered access_paths”:[
{
“rows_to_scan”: 64,
“access_type”:“range”,
“range_details”:{
“used index”:“uidx_1”
} /* range_details /,
“resulting_rows”: 64,
“cost”: 90.61,
“chosen”: true
}
] / considered access_paths */,
根据以上信息:两个 SQL 的 cost 部分是完全相同的,且在优化器分析阶段只能识别到 b 的条件。分析阶段,只能根据优化器认为可用的列来计算 cost。ICP 特性,应该是在执行阶段采用用到的特性。
同时,根据 SQL-3 的执行跟踪结果,对比全表扫描和索引扫描的 cost,截取部分结果如下:
SQL-3
select * from ltb2 where b >= ‘20230717’ and c = ‘code001’;
#全表扫描结果
“range_analysis”: {
“table _scan”: {
“rows”: 4669,
“cost”: 1018.9
} /* table_scan */,
#索引扫描评估结果
“analyzing_range_alternatives”: {
“range_scan_alternatives”: [
{
“index”:“uidx_1”,
“ranges”:[
“@xe7ce0f] <= b”
] /* ranges /,
“index dives_for_eq_ranges”: true,
“rowid_ordered”: false,
“using_mrr”: false,
“index_only”: false,
" rows": 1273,
“cost”: 1528.6,
“chosen”: false,
“cause”:“cost”
}
] / range scan_alternatives */,
#最优执行计划
“best_access_path”: {
“considered access_paths”:[
{
“rows_to_scan”: 4669,
“access_type”:“scan”,
“resulting_rows”: 4669,
“cost”: 1016.8,
“chosen”: true
}
] /* considered access_paths // best access_path */
}
由于优化器阶段使用使用列 b,使用索引的成本高于全表扫描。那最终数据库就会选择使用全表扫描。除非应用使用 hint 强制索引:
mysql> desc select * from ltb2 FORCE INDEX (uidx_1) where b >= ‘20230717’ and c = ‘code001’;
#部分结果
±---------±--------±--------+
| key_len | rows | Extra |
±---------±--------±--------+
| 133 | 1273 | Using Index condition |
±---------±--------±--------+
同时,根据执行计划的输出结果,rows 列应该是优化器阶段的输出,key_len/Extra 则包括了执行阶段的输出。
综上所述,对于问题 SQL 和索引结构,由于列 b 为索引的最左列,且查询时的条件为 b>= ‘20230717’(非等值条件),数据库优化器只能“使用”到 b 列。并给予“使用”的列,评估扫码的行数和 cost。
如果优化器评估后,使用索引的成本更低,则可以使用该索引,并利用 ICP 特性进一步提高查询性能;
如果优化器评估后,使用全表扫描或的成本更低,那数据库就会选择使用全表扫描。
3、SQL 优化方案
根据第 2 部分明确了问题的原因后,通过调整索引,解决最左列尾范围查询的问题即可解决该问题。具体如下:
alter table ltb2 drop index uidx_1;
alter table ltb2 add index uidx_1(c,b);
alter table ltb2 add index idx_(b);
死锁为何发生
自此,完成了 SQL 执行计划问题的分析和解决。但直接的问题是死锁,因查询语句无法使用索引,正常就应该使用全表扫描。但是全表扫描为什么会出现死锁呢?
在此,参考《故障分析 | 从 Insert 并发死锁分析 Insert 加锁源码逻辑》的经验,对死锁过程进行大胆猜想:
T1 时刻
trx-2 执行了 UPDATE,在处理行时,在 row_search_mvcc 函数中,查询到数据。获取了对应行的 LOCK_X,LOCK_REC_NOT_GAP 锁;
T2 时刻
trx-1 执行了 DELETE,在处理行时,在 row_search_mvcc 函数中,查询到数据,尝试获取行的 LOCK_X,LOCK_REC_NOT_GAP。但由于 trx-1 已经持有了该锁,因此被堵塞。并会创建一个锁(以指示锁等待);
T3 时刻
trx-2 继续执行 UPDATE 操作。由于是该操作除了在 T1 时刻的操作外,在其它位置,还需要获取锁(lock_mode X locks rec but not gap)。但由于 T2 时刻,trx-1 尝试获取该锁而被堵塞,并且也增加了一个锁。
假如此时,此处的实现机制和 INSERT 死锁案例一样,也没有先进行冲突检查。而只是看记录上是否存在锁的话,那么此时也会看到该记录上有 trx-1 事务的锁。从而导致 trx-2 第二次获取锁时,被堵塞。
死锁发生!
以上仅根据经验进行的猜想,真正的原因还需要进一步分析和验证。有兴趣的读者结合如下几个问题,进一步研究。
以上各步骤获取锁的位置,是否正确?
T3 时刻,update操作在其它的什么位置再次获取了锁?
T3 时刻,发起的假设是否成立?如成立,具体逻辑是什么?不成立,那正确的逻辑是什么?
T3 时刻,如果假设不成立,那死锁的原因又是什么?
以上都是针对于唯一索引/主键索引的执行逻辑分析的。那结合该案例,全表扫描和索引查询的执行逻辑是否存在差异?差异的地方在哪里?
除了调整索引,还能通过什么方式避免该问题发生?
相关文章:
【MySQL】 MySQL 死锁问题分析优化器特性及优化方案
MySQL 死锁问题分析优化器特性及解决方案 MySQL 锁机制介绍 1、MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级…...
【C++面向对象侯捷】8.栈,堆和内存管理
文章目录 栈,堆stack object的生命周期static local object的生命周期global object的生命周期heap objects 的生命期new:先分配memory,再调用构造函数delete: 先调用析构函数,再释放 memory动态分配所得的内存块,in V…...
在比特币上使用可检索性证明支付存储费用
我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比,用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR),该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…...
使用SSE(Server-Sent Events)实现服务端给客户端发消息
首先是客户端,看着比较简单。但实际应用中可能要比这复杂,因为默认sse只支持get请求,而且没法携带header。所以如果默认的方法达不到需求的话可能需要额外实现,当然也可以引用第三方库,比如rangermauve/fetch-event-so…...
【Redis】使用rpm包安装redis
背景说明 公司环境处于内网,某同事需要安装redis,如果使用通过源码编译安装redis,很多编译工具如gcc就需要先安装,但处于内网安装起来不太方便,当然也不是不可以。我们此处就选用通过redis的rpm包进行安装。 rpm包查…...
论文阅读-Group-based Fraud Detection Network on e-Commerce Platforms
目录 摘要 1 Introduction 2 BACKGROUND AND RELATED WORK 2.1 Preliminaries 2.2 Related Works 3 MODEL 3.1 Structural Feature Initialization 3.2 Fraudster Community Detection 3.3 Training Objective 4 EXPERIMENT 4.1 Experimental Setup 4.2 Prediction …...
java程序启动时指定JVM内存参数和Xms、Xmx参数学习
先找个java程序来试验;找这个, java实现计算机图形学中点画线算法_java 多个点连成一条线 算法-CSDN博客 JVM内存参数中, -Xms:设置堆内存的初始大小,默认为物理内存的1/64; -Xmx:设置堆内存的…...
【C++编程能力提升】
代码随想录训练营Day44 | Leetcode 518、377 一、完全背包问题1、完全背包与01背包的区别 二、518 零钱兑换II三、377 组合总和IV 一、完全背包问题 1、完全背包与01背包的区别 第一,物品的有限与无限; 01背包:物品是有限的。(每…...
FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心
FlashDuty:一站式告警响应平台,前往此地址免费体验! 自定义字段 FlashDuty 已支持接入大部分常见的告警系统,我们将推送内容中的大部分信息放到了 Lables 进行展示。尽管如此,我们用户还是会有一些扩展或定制性的需求…...
贪心算法-
代码随想录 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 这么说有点抽象,来举一个例子: 例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿ÿ…...
漫谈:C语言 C++ 左值、右值、类型转换
编程不是自然语言,编程自有其内在逻辑。 左值引起的BUG 编译器经常给出类似这样的BUG提示: “表达式必须是可修改的左值” “非常量引用的初始值必须是左值” 看一下示例: #include <iostream>void f(int& x) {} int main() {sho…...
前车之鉴,后车之师
问题分类具体解释可能导致的后果解决方法备注主从延迟数据库写后立即读的场景,比如订单落地成功抛消息,消息接收方再读订单推订单中心、发触达、落地数据等场景,再读数据时走从库,可能读不到数据。脏数据业务逻辑有问题延迟消费。…...
WEB使用VUE3实现地图导航跳转
我们在用手机查看网页时可以通过传入经纬度去设置目的地然后跳转到对应的地图导航软件,如果没有下载软件则会跳转到下载界面 注意: 高德地图是一定会跳转到一个新网页然后去询问用户是否需要打开软件百度和腾讯地图是直接调用软件的这个方法有缺陷&…...
今天聊一聊高性能系统架构设计是什么样的
Java全能学习面试指南:https://javaxiaobear.cn 今天聊一聊大家常听到的高性能系统架构。 高性能系统架构,主要包括两部分内容,性能测试与性能优化。性能优化又可以细分为硬件优化、中间件优化、架构优化及代码优化,知识架构图如…...
鼠标不动了怎么办?3招解决问题!
“这是怎么回事呢?我的鼠标怎么会用着用着就突然不动了呢?现在有一些比较重要的工作要处理。请问有什么方法可以快速解决这个问题吗?” 随着电脑在我们日常生活和工作中的广泛应用,鼠标是我们操作电脑不可或缺的工具之一。但是&am…...
2023-09-23力扣每日一题
链接: 1993. 树上的操作 题意 **Lock:**指定用户给指定节点 上锁 ,上锁后其他用户将无法给同一节点上锁。只有当节点处于未上锁的状态下,才能进行上锁操作。**Unlock:**指定用户给指定节点 解锁 ,只有当…...
C#中使用Newtonsoft.Charp实现Json对象序列化与反序列化
场景 C#中使用Newtonsoft.Json实现对Json字符串的解析: C#中使用Newtonsoft.Json实现对Json字符串的解析_霸道流氓气质的博客-CSDN博客 上面讲的对JSON字符串进行解析,实际就是JSON对象的反序列化。 在与第三方进行交互时常需要封装对象,…...
Golang开发--互斥锁和读写锁
互斥锁(Mutex) 互斥锁(Mutex)是一种并发控制机制,用于保护共享资源的访问。互斥锁用于确保在任何给定时间只有一个 goroutine(Go 语言中的并发执行单元)可以访问被保护的共享资源,从…...
Springboot 集成WebSocket作为客户端,含重连接功能,开箱即用
使用演示 public static void main(String[] args) throws Exception{//初始化socket客户端BaseWebSocketClient socketClient BaseWebSocketClient.init("传入链接");//发送消息socketClient.sendMessage("填写需要发送的消息", (receive) -> {//这里…...
java调整字符串
package 字符串练习;public class 调整字符串 {/* 如果调整成功则给提示,返回不成功也给提示调整 例如:abcde -> bcdea -> cdeab 就是把第一个值放到最后的位置上现在是给定两个字符串, 选定其中一个进行调整, (我们想一下,如果调整字符串的长度次,那不就是返回到原来的字…...
2023-9
内核向应用层发送netlink单播消息: nlmsg_unicast -> netlink_unicast -> netlink_sendskb -> __netlink_sendskb -> 把skb链入struct sock 的 sk_receive_queue 链表中,再调用sk->sk_data_ready(sk); -> sock_def_readable -> wak…...
软考高级+系统架构设计师教程+第二版新版+电子版pdf
注意!!! 系统架构设计师出新版教程啦,2022年11月出版。所以今年下半年是新版第一次考试,不要再复习老版教程了,内容改动挺大的。 【内容简介】系统架构设计师教程(第2版)作为全国计…...
【产品运营】如何提升B端产品竞争力(下)
“好产品不是能力内核,做好产品的流程才是” 一、建立需求池和需求反馈渠道 需求池管理是B端产品进化最重要的环节,它的重要性远超产品设计、开发等其他环节。 维护需求池有主动和被动两种。 主动维护是产品经理在参与售前、迭代、交付、售后、竞品分…...
uniapp 微信小程序使用echarts
本文目的:通过分包的方式,尽可能在微信小程序中使用最新的echarts。 当然你也可以直接使用现成的uchart或者市场里别人封好的echarts. 准备工作 下载echarts-for-weixin源码。 复制ec-canvas文件夹以及下属文件,在uniapp项目中与pages同级的地…...
【漏洞复现】企望制造 ERP命令执行
漏洞描述 由于企望制造 ERP comboxstore.action接口权限设置不当,默认的配置可执行任意SQL语句,利用xp_cmdshell函数可远程执行命令,未经认证的攻击者可通过该漏洞获取服务器权限。 免责声明 技术文章仅供参考,任何个人和组织…...
2023 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|数学建模完整代码+建模过程全解全析
问题一 血肿扩张风险相关因素探索建模 思路: 根据题目要求,首先需要判断每个患者是否发生了血肿扩张事件。根据定义,如果后续检查的血肿体积比首次检查增加≥6 mL或≥33%,则判断为发生了血肿扩张。 具体判断步骤: (1) 从表1中提取每个患者的入院首次影像检查…...
【腾讯云国际站】CDN内容分发网络特性介绍
为什么使用腾讯云国际站 CDN 内容分发网络? 当用户直接访问源站中的静态内容时,可能面临的体验问题: 客户离服务器越远,访问速度越慢。客户数量越多,网络带宽费用越高。跨境用户访问体验较差。 腾讯云国际站CDN 如何改…...
【工业机器人视觉】
工业机器人视觉 工业机器人的定位、抓取任务是工业生产线上一项重要的应用,一般通过预先示教的方式让机器人执行预定的指令动作。但是,一旦工件的状态发生改变时,机器人便无法完成工作任务。区别:就像人睁眼走直线和闭眼走直线。…...
跨域(浏览器)
跨域问题 是前端开发中常遇到的一个挑战。由于浏览器的同源策略限制,前端在发起异步请求时会受到限制,只能向相同源(域名、协议和端口号都相同)的服务器发送请求。当请求的目标服务器与当前页面的源不一致时,就会触发…...
Leetcode 2866. Beautiful Towers II
Leetcode 2866. Beautiful Towers II 1. 解题思路2. 代码实现 题目链接:2866. Beautiful Towers II 1. 解题思路 这一题其实思路上还是比较明显的,就是一个单调数组的问题,问题在于说如果具体去设计这个单调数组。 我们从题目出发&#x…...
励志做的很好的网站/中国腾讯和联通
注意: 如果dll文件不写相对路径,需要吧dll文件和执行代码放在同一个文件夹中 参考文章:https://blog.csdn.net/mixiao25184/article/details/18604385 文件结构: 代码如下: //BIN_LIB为JAR包中存放DLL的路径//getReso…...
开网络公司做网站挣钱吗/贵阳seo网站推广
一、路由 uni-app页面路由为框架统一管理,需要在pages.json里配置每个路由页面的路径和页面样式。类似的小程序在app.json中配置页面路由相同 页面栈 框架以栈的形式管理当前所有页面,当发生路由切换的时候,页面栈的表现如下: …...
html 网站源码 卖手机/互联网营销的方法
2019独角兽企业重金招聘Python工程师标准>>> (index):11 Uncaught ReferenceError: testAlert is not definedat HTMLInputElement.onclick ((index):11)解决: if后面漏了{。 要从chrome控制台看。否则很难定位。 Uncaught SyntaxError: Unexpected toke…...
怎样制作购物网站 微信转发/谷歌seo排名优化
如果车票开售的第一时间没有抢到票也不要着急,旅客还有5个“捡漏”机会: 1、开售30分钟后,如有旅客未及时付款,车票会重新返回系统发售。 2、开车前15天,是退票高峰期。 3、开车前48小时和24小时,系统会放出…...
网站关键词掉的很快/国外域名
迭代器模式介绍 顺序访问一个集合 顺序:如数组、类数组称为顺序,而非对象,能从0,1,2…通过index访问的值 使用者无需知道集合的内部结构 示例 如果要对这三个变量进行遍历,需要写三个遍历方法 <p>…...
dede做购物网站/提高工作效率心得体会
在敬业签上设置的提醒事项超时了,敬业签便签如何设置延迟提醒呢? 一:首先要找到超时的那条便签,然后在文本内容上或者提醒时间上单击鼠标右键调出菜单。需要注意的是,在不同区域单击右键,弹出的菜单不一样…...