mysql隔离级别RR下的行锁、临键锁、间隙锁详解及运用

article/2025/9/15 23:38:24

一:mysql 锁的基本概念

锁:悲观锁、乐观锁

悲观锁:写锁 for update、读锁for share 

写锁:只允许当前事务读写,其它事务全部等待,包括读取数据,锁的数据范围需要具体分析

读锁:允许所有事务进行读取,但不允许写,首先获得数据读锁的事务可以在事务中进行写操作,一旦进行了写操作,其它事务就会全部进行等待,包括读也不允许了,所以一般需要读又要写的使用“写锁”

二:加锁数据范围规则

        原则1:访问到的数据都要加"临键锁"
        原则2:查询时会在索引上访问到第一个不满足需要查询数据的值为止,不满足条件的第一个值上也会加"临键锁"
        原则3:索引查询(除唯一索引等值{查到了值}查询和非唯一索引范围查询以外)都加 "临键锁退化为间隙锁"
        原则4:唯一索引等值查询{查到了值}退化为"行锁"

        bug: 唯一索引范围查询时依旧会往下一个值查询,且不会退化为间隙锁,依旧是左开右闭;不过有的mysql版本是左开又开(间隙锁);范围查询有等于的时候不会向下一个滑寻找不等于自己的值;如果存在Bug的版本就和非唯一索引的结果一样,都是临建锁+下滑;如果修复了bug那就是间隙锁    {仅只针对唯一索引范围查询存在的Bug}

结论:

        理论上: 

        当前测试的mysql版本:

           结果:

        1.唯一索引和非唯一索引(除了唯一索引等值查询)都会向右遍历且最后一个值不满足等值条件的时候才停止。

        2.唯一索引和非唯一索引“范围查询”都不会退化为间隙锁,非唯一索引本身就不会退化,唯一索引是因为mysql版本的bug原因不退化 ==》     范围查询存在BUG就会下滑且都加临建锁

        3.非唯一索引和唯一索引等值查询(未差查到值) 都是会下滑且都会优化为间隙锁

可以通过  select * from performance_schema.data_locks; 检验

测试数据

一:索引

        1、非唯一索引

        2、唯一索引

二:非唯一索引

select * from  cs where age=20  for update
-- 非唯一索引等值查询{查到了值}
-- 首先给20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找首个不等于20的值为止,也就是30,给30上临键锁,范围(20,30],又根据原则3退化为间隙锁范围(20,30)
-- 最终范围(10,30)

select * from  cs where age=21  for update
-- 非唯一索引等值查询{没查到值}
-- 首先21的值没查到,没查到的值不用上临键锁
-- 根据原则2会去寻找首个不等于21的值为止,也就是30,给30上临键锁,范围(20,30],又根据原则3退化为间隙锁范围(20,30)
-- 最终范围(20,30)

select * from  cs where age=2000  for update
-- 非唯一索引等值查询{没查到值}
-- 首先2000的值没查到,并且是超出了表的已有数据范围之外的数据,可以自己默认上个临键锁(100,2000]
-- 根据原则2会去寻找首个不等于2000的值为止,但此时没有符合条件的,此时就会一直找+∞,所以会锁定(2000,+∞]的数据
-- 最终范围(100,+∞]

select * from  cs where age>20 for update
-- 非唯一索引范围查询
-- 首先>20是属于20-30之间的一个不确定值(不含20),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找首个不等于这个大于20的值为止,也就是30,给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 又因为是>20没有后部分的区间,所以会加锁(30,+∞]
-- 最终范围(20,+∞]


select * from  cs where age>=20 for update
-- 非唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找首个不等于这个等于20的值为止,也就是30,给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 又因为是>=20没有后部分的区间,所以会加锁(30,+∞]
-- 最终范围(10,+∞]

select * from  cs where age>20 and age<22 for update
-- 非唯一索引范围查询
-- 首先>20是第一范围区间是在20-30之间的一个不确定值(不含20),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个大于20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 再处理 <22,也是第一范围区间是在20-30之间的一个不确定值(不含230)
-- 根据原则2会去寻找下一个首个不等于这个小于22的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 最终范围(20,30]


select * from  cs where age>20 and age<30 for update
-- 非唯一索引范围查询
-- 首先>20是第一范围区间是在20-30之间的一个不确定值(不含20),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个大于20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 再处理 <30,也是第一范围区间是在20-30之间的一个不确定值(不含30)
-- 根据原则2会去寻找下一个首个不等于这个小于30的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 最终范围(20,30]


select * from  cs where age>20 and age<=30 for update
-- 非唯一索引范围查询
-- 首先>20是第一范围区间是在20-30之间的一个不确定值(不含20),也就是范围内不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个大于20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 再处理 <=30,30上临键锁,锁范围(20,30]
-- 根据原则2会去寻找下一个首个不等于这个30的值为止,也就是35,给35上临键锁,范围(30,35],由于是范围查询不会退化
-- 最终范围(20,35]


select * from  cs where age>=20 and age<30 for update
-- 非唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找下一个首个不等于这个20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 再处理 <30,也是第一范围区间是在20-30之间的一个不确定值(不含30),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个小于30的值为止,也就是30,给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 最终范围(10,30]

select * from  cs where age>=20 and age<=30 for update
-- 非唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找下一个首个不等于这个20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 再处理 <=30,30上临键锁,锁范围(20,30]
-- 根据原则2会去寻找下一个首个不等于这个30的值为止,也就是35,给35上临键锁,范围(30,35],由于是范围查询不会退化
-- 最终范围(10,35]


select * from  cs where age>=20 and age<=100 for update
-- 非唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找下一个首个不等于这个20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化
-- 再处理 <=100,100上临键锁,锁范围(42,100]
-- 根据原则2会去寻找下一个首个不等于这个100的值为止,但100后面没有值了,此时就锁(100,+∞]
-- 最终范围(10,+∞]


select * from  cs where age>=1 and age<=1000 for update
-- 非唯一索引范围查询
-- 首先>=1,1上临键锁,锁范围(-∞,1]
-- 根据原则2会去寻找下一个首个不等于这个1的值为止,也就是10,优先暂时给10上临键锁,范围(1,10],由于是范围查询不会退化
-- 再处理 <=1000,1000上临键锁,锁范围(42,100]
-- 根据原则2会去寻找下一个首个不等于这个1000的值为止,但此时没有符合条件的,此时就会一直找+∞,所以会锁定(1000,+∞]的数据
-- 由于是范围查询,根据原则1被查询的到的数据都会加锁,所以1-100的数据都会加临键锁
-- 最终范围[-∞,+∞]


select * from  cs where age>=1 and age<100 for update
-- 非唯一索引范围查询
-- 首先>=1,1上临键锁,锁范围(-∞,1]
-- 根据原则2会去寻找下一个首个不等于这个1的值为止,也就是10,优先暂时给10上临键锁,范围(1,10],由于是范围查询不会退化
-- 再处理 <100,也是第一范围区间是在42-100之间的一个不确定值(不含100),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个小于100的值为止,也就是100,给100上临键锁,范围(42,100],由于是范围查询不会退化
-- 由于是范围查询,根据原则1被查询的到的数据都会加锁,所以1-100的数据都会加临键锁
-- 最终范围[-∞,100]

二:唯一索引  【范围中带等于的是因为某些版本的bug会下滑,不是所有版本都会下滑,有些版本会退化为行锁,临键锁也会退化为间隙锁】

select * from  cs where wy=20  for update
-- 唯一索引等值查询{查到了值}
-- 首先给20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找首个不等于20的值为止,也就是30,给30上临键锁,范围(20,30],又根据原则3退化为间隙锁范围(20,30)

-- 根据原则4所有的锁都将退化为行锁
-- 最终范围 20

select * from  cs where wy=21  for update
-- 唯一索引等值查询{没查到值}
-- 首先21的值没查到,没查到的值不用上临键锁
-- 根据原则2会去寻找首个不等于21的值为止,也就是30,给30上临键锁,范围(20,30],又根据原则3退化为间隙锁范围(20,30)
-- 最终范围(20,30)

select * from  cs where wy=2000  for update
-- 唯一索引等值查询{没查到值}
-- 首先2000的值没查到,并且是超出了表的已有数据范围之外的数据,可以自己默认上个临键锁(100,2000]
-- 根据原则2会去寻找首个不等于2000的值为止,但此时没有符合条件的,此时就会一直找+∞,所以会锁定(2000,+∞]的数据

--但因为是唯一索引,如果超出数据范围外就不会再上锁
-- 最终范围    无锁

select * from  cs where wy>20 for update
-- 唯一索引范围查询
-- 首先>20是属于20-30之间的一个不确定值(不含20),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找首个不等于这个大于20的值为止,也就是30,给30上临键锁,范围(20,30],

-- 根据原则3会退化为间隙锁(20,30)  这里会不会退化有带考证,可能会因为Bug不退化
-- 又因为是>20没有后部分的区间,所以会加锁(30,+∞]
-- 最终范围(20,+∞]


select * from  cs where wy>=20 for update
-- 唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20],根据原则3会退化为间隙锁(10,20) 这里会不会退化有带考证,可能会因为Bug不退化,根据原则4还会上行锁 20    所以最终(10,20]
-- 根据原则2会去寻找首个不等于这个等于20的值为止,也就是30,给30上临键锁,范围(20,30] 

-- 根据原则3会退化为间隙锁(20,30)  这里会不会退化有带考证,可能会因为Bug不退化
-- 又因为是>=20没有后部分的区间,所以会加锁(30,+∞]
-- 最终范围(10,+∞]     当然还有对应的主键id锁

select * from  cs where wy>20 and wy<22 for update        
-- 唯一索引范围查询
-- 首先>20是第一范围区间是在20-30之间的一个不确定值(不含20),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个大于20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)   但因为bug,还是(20,30]
-- 再处理 <22,也是第一范围区间是在20-30之间的一个不确定值(不含30)
-- 根据原则2会去寻找下一个首个不等于这个小于22的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)   但因为bug,还是(20,30]
-- 最终范围(20,30]        因为bug根据原则2会锁住下一个值的临建锁且不会退化


select * from  cs where wy>20 and wy<30 for update 
-- 唯一索引范围查询
-- 首先>20是第一范围区间是在20-30之间的一个不确定值(不含20),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个大于20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)   但因为bug,还是(20,30]
-- 再处理 <30,也是第一范围区间是在20-30之间的一个不确定值(不含30)
-- 根据原则2会去寻找下一个首个不等于这个小于30的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)  但因为bug,还是(20,30]
-- 最终范围(20,30]


select * from  cs where wy>20 and wy<=30 for update   
-- 唯一索引范围查询
-- 首先>20是第一范围区间是在20-30之间的一个不确定值(不含20),也就是范围内不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个大于20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)   但因为bug,还是(20,30]
-- 再处理 <=30,30上临键锁,锁范围(20,30]
-- 根据原则2会去寻找下一个首个不等于这个30的值为止,也就是35,给35上临键锁,范围(30,35],根据原则3会退化为间隙锁(30,35)   但因为bug,还是(20,35]
-- 最终范围(20,35]


select * from  cs where wy>=20 and wy<30 for update     
-- 唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20]  
-- 根据原则2会去寻找下一个首个不等于这个20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)

--根据原则4退化为行锁 最终锁定行锁   20     但因为bug,还是(20,30]
-- 再处理 <30,也是第一范围区间是在20-30之间的一个不确定值(不含30),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个小于30的值为止,也就是30,给30上临键锁,范围(20,30],根据原则3会退化为间隙锁(20,30)   但因为bug,还是(20,30]
-- 最终范围(10,30]

select * from  cs where wy>=20 and wy<=30 for update     
-- 唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20] 
-- 根据原则2会去寻找下一个首个不等于这个20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],由于是范围查询不会退化   但因为bug,还是(20,30]
-- 再处理 <=30,30上临键锁,锁范围(20,30]
-- 根据原则2会去寻找下一个首个不等于这个30的值为止,也就是35,给35上临键锁,范围(30,35],根据原则3会退化为间隙锁(30,35)    但因为bug,还是(30,35]
-- 最终范围(10,35]


select * from  cs where wy>=20 and wy<=100 for update  
-- 唯一索引范围查询
-- 首先>=20,20上临键锁,锁范围(10,20]
-- 根据原则2会去寻找下一个首个不等于这个20的值为止,也就是30,优先暂时给30上临键锁,范围(20,30],  但因为bug,还是(20,30]
-- 再处理 <=100,100上临键锁,锁范围(42,100]
-- 根据原则2会去寻找下一个首个不等于这个100的值为止,但100后面没有值了,此时就锁(100,+∞]
-- 最终范围(10,+∞]


select * from  cs where wy>=1 and wy<=1000 for update  
-- 唯一索引范围查询
-- 首先>=1,1上临键锁,锁范围(-∞,1]
-- 根据原则2会去寻找下一个首个不等于这个1的值为止,也就是10,优先暂时给10上临键锁,范围(1,10],  但因为bug,还是(1,10]
-- 再处理 <=1000,1000上临键锁,锁范围(42,100]
-- 根据原则2会去寻找下一个首个不等于这个1000的值为止,但此时没有符合条件的,此时就会一直找+∞,所以会锁定(1000,+∞]的数据
-- 由于是范围查询,根据原则1被查询的到的数据都会加锁,所以1-100的数据都会加临键锁
-- 最终范围[-∞,+∞]


select * from  cs where wy>=1 and wy<100 for update   
-- 唯一索引范围查询
-- 首先>=1,1上临键锁,锁范围(-∞,1]
-- 根据原则2会去寻找下一个首个不等于这个1的值为止,也就是10,优先暂时给10上临键锁,范围(1,10],  但因为bug,还是(1,10]
-- 再处理 <100,也是第一范围区间是在42-100之间的一个不确定值(不含100),也就是不存在的值,没查到的值不用上临键锁
-- 根据原则2会去寻找下一个首个不等于这个小于100的值为止,也就是100,给100上临键锁,范围(42,100],  但因为bug,还是(1,10]
-- 由于是范围查询,根据原则1被查询的到的数据都会加锁,所以1-100的数据都会加临键锁
-- 最终范围[-∞,100]

                


http://chatgpt.dhexx.cn/article/yBZuq9Km.shtml

相关文章

MySQL行锁、表锁、间隙锁详解

前言 我们前几篇讲了索引是什么&#xff0c;如何使用explain分析索引使用情况&#xff0c;如何去优化索引&#xff0c;以及show profiles分析SQL语句执行资源消耗的学习。今天我们来讲讲MySQL的各种锁&#xff0c;这里存储引擎我们使用InnoDB&#xff1b; 准备工作 创建表 t…

Mysql_行锁、临键锁、间隙锁的理解

目录 行锁间隙锁临键锁总结 行锁 行锁&#xff0c;也称为记录锁。 当我们针对主键或者唯一索引加锁的时候&#xff0c;Mysql默认会对查询的这一行数据加行锁&#xff0c;避免其他事务对这一行数据进行修改。 间隙锁 间隙锁&#xff0c;顾名思义&#xff0c;就是锁定一个索引…

【MySQL】MySQL的锁机制 - 记录锁、间隙锁、临键锁

目录 一、参考链接二、总结1、间隙锁的目的2、什么时候产生间隙锁&#xff1f;3、间隙锁锁定的范围4、需要注意的点&#xff08;重要&#xff09; 三、案例建表案例1:查询已存在的单条记录案例2:查询不存在的记录案例3:查询多条记录&#xff08;范围查询&#xff09; 四、其余验…

MySQL的锁机制 - 记录锁、间隙锁、临键锁

记录锁(Record Locks) 记录锁是 封锁记录&#xff0c;记录锁也叫行锁&#xff0c;例如&#xff1a; SELECT * FROM test WHERE id1 FOR UPDATE; 它会在 id1 的记录上加上记录锁&#xff0c;以阻止其他事务插入&#xff0c;更新&#xff0c;删除 id1 这一行。 记录锁、间隙锁…

行锁、间隙锁、next-key锁

参考博客&#xff1a;cmysql锁&#xff08;九&#xff09;innodb下的记录锁&#xff0c;间隙锁&#xff0c;next-key锁 - 简书 Mysql 行锁、间隙锁和next-key锁详解_程序员掉头发的博客-CSDN博客_行锁 间隙锁 行锁(Record Lock)&#xff1a; 对索引记录加锁。间隙锁(Gap Lock…

mysql记录锁、间隙锁、临键锁

名词解释 记录锁&#xff1a;record lock,即锁住一条记录 间隙锁&#xff1a;gap lock,即锁定一个区间&#xff0c;左开又开 临键锁&#xff1a;记录锁间隙锁锁定的区间&#xff0c;左开右闭 mysql如何加锁 假设有如下数据 其中&#xff0c;id 是主键索引&#xff08;唯一索…

【MySQL】记录锁?间隙锁?临键锁?到底锁了些什么?这一篇帮你捋清楚( ̄∇ ̄)/

特别强调&#xff5e; 本测试使用的是MySQL 8.0.27&#xff5e; 8.0.27&#xff5e; 8.0.27&#xff08;因为不同版本命令可能会有差异哈&#xff09; 打开两个终端&#xff0c;分别连接上MySQL&#xff0c;使用select global.transaction_isolation;查看隔离级别&#xff08…

MySQL的锁机制——记录锁、间隙锁、临键锁

记录锁(Record Locks) 记录锁锁住的是索引记录&#xff0c;记录锁也叫行锁。如果使用索引作为条件命中了记录&#xff0c;那么就是记录锁&#xff0c;被锁住的记录不能被别的事务插入相同的索引键值&#xff0c;修改和删除。 例如&#xff1a; select * from test_table whe…

mysql 间隙锁

一、什么是间隙锁&#xff1f; 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;锁加在不存在的空闲空间&#xff0c;可以是两个索引记录之间&#xff0c;也可能是第一个索引记录之前或最后一个索引之后的空间。 当我们用范围条件而不是相等条件索引数据&#xff0c;并请求…

什么是间隙锁

中心思想 间隙锁锁的是索引叶子节点的next指针。 意义 解决了mysql RR级别下是幻读的问题。 快照读 在RR隔离级别下&#xff1a;快照读有可能读到数据的历史版本&#xff0c;也有可能读到数据的当前版本。所以快照读无需用锁也不会发生幻读的情况。 当前读 当前读&#…

MySql进阶-间隙锁(gap-key)

文章目录 Innodb锁算法关闭Gap LockGap-key 解决的问题间隙锁影响MVCC 核心原理ReadView 可参考 快照读&#xff0c;当前读可参考 参考《InnoDB存储引擎》 注意&#xff1a;gap-key是innodb存储引擎来解决当前读的幻读问题的。对于隔离级别下的可重复读只能解决快照读的幻读问题…

dubbo接口调试工具

最近的项目使用来dubbo进行开发&#xff0c;虽然可以使用telne客户端t进行dubbo的接口的调试&#xff0c;但总感觉调试起来不太方便&#xff0c;并且限制太多&#xff0c;于是抽了点时间出来编写了一个dubbo的客户端可视化调试工具&#xff0c;功能虽简单但可以快速的调试dubbo…

Android Studio调试工具总结

前言&#xff1a;写代码不可避免有Bug&#xff0c;通常情况下除了日志最直接的调试手段就是debug&#xff1b;当我们的程序出现bug时&#xff0c;调试可以快速的找到bug。进入调试状态&#xff0c;我们可以清楚的了解程序的整个执行过程&#xff0c;可以对内存的数据进行监视。…

串口调试、udp 调试、tcp 调试,websocket 调试,通讯调试工具

简介 一个通讯测试工具&#xff0c;QSAK&#xff08;Qt Swiss Army Knife&#xff09;是一款基于Qt开源框架打造的多功能、跨平台调试工具。目前支持串口调试、udp 调试、tcp 调试及 websocket 调试等。支持 Windows、Linux、raspberry pi 等平台。 免费、开源、绿色、免安装…

chrome--浏览器调试工具详解

chrome浏览器开发调试工具打开方式&#xff1a;F12键 一&#xff0c;常用面板介绍 1.定位小箭头按钮(左边第一个)&#xff1a; 选中Elements面板&#xff0c;并启动该按钮&#xff0c;可以在页面中定位相应元素的源代码位置&#xff0c;或者选择源代码位置可定位到页面相应的元…

通讯调试工具推荐

CommBox通讯调试工具-简单说明 工具支持&#xff1a;串口通讯、串口代理、TCP、UDP、Telnet、Ping、TFtp、串口监视、以太网嗅探等通讯测试 1、本工具支持预定义命令&#xff0c;命令可以进行分组&#xff0c;由树形控件管理。点击“命令编辑”即可编辑预…

modbus调试工具的使用

modbus调试工具的使用分为2部分&#xff0c;2者互相不影响&#xff0c;可以单独使用。 一、根据IP进行模拟通信 二、根据COM进行模拟通信 一、根据IP进行模拟通信 1.安装完成ModbusPollSetup64Bit后&#xff0c;输入注册码进行注册&#xff1b;安装完成ModbusSlaveSetup64Bi…

两款常用的 MQTT 调试工具

文章目录 一、前言二、预备知识三、MQTTBox1、介绍2、下载3、入门使用4、负载测试 四、MQTT.fx1、介绍2、下载3、入门使用4、JS 脚本 一、前言 我们可以使用 MQTT 客户端来测试 MQTT 的通讯功能&#xff0c;这里介绍常用的两款工具 MQTTBox 和 MQTT.fx 。 二、预备知识 MQTT…

简易Window BLE调试工具

简易Windows BLE调试工具 一、简介 Windows BLE调试工具是一款运行在Windows下的BLE调试软件&#xff0c;实现了扫描、连接、获取BLE设备上的服务以及向服务写入和读取数据的功能。 二、运行要求 系统需要使用Windows 10及以上的版本;需要电脑带有蓝牙功能或者使用外接蓝牙…

wsdl在线调试工具

1.下载soapui 2.进行调试 注:1.wsdl地址在测试服务器上一定要能联通 2.测试时如果是xml标签,需要进行转义 http://www.ku51.net/rehtml/ 3.在wsdl地址后面拼接?wsdl能够看到具体的接口信息 3.使用post进行请求示例