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

2023/11/30 10:17:37

一: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://www.jnnr.cn/a/114136.html

相关文章

马斯克的这波神操作,让我意识到保持写代码的能力有多重要

作为一个在IT行业摸爬滚打了多年的老油条&#xff0c;我是越来越看不懂现在的互联网行业了。 至少曾经我听过太多人吐槽写代码的永远干不过写PPT的&#xff0c;并且在现实工作中验证过也确实如此&#xff0c;但是老马的这一波骚操作&#xff0c;让推特工程师打印出最近30-60天…

【数据结构】单链表的增删查改

目录一、链表的定义二、单链表的实现2.1、动态开辟一个空间2.2、单链表的打印2.3、单链表的插入操作尾插头插单链表在pos位置之后插入x单链表在pos位置之前插入x2.4、单链表的删除操作尾删头删删除pos后一个删除pos位置2.5、单链表的查找及释放操作查找释放一、链表的定义 链表…

人机智能的逻辑哲学论

1.世界是由事实和价值共同组成的1.1 事实由对象、事态及其联系&#xff08;如语言&#xff09;构成1.2 价值是事实在实践中的作用和效果构成1.3 事实中存在着决定论&#xff0c;价值里包含有自由意志1.3.1 事实反映有无&#xff0c;价值反映好坏1.4 每一个事实都具有变价值&…

【JVM技术专题】TLAB内存分配+锁的碰撞技术串烧「难点-核心-遗漏」

JVM内存分配及申请过程 当使用new关键字或者其他任何方式进行创建一个类的对象时&#xff0c;JVM虚拟机需要为该对象分配内存空间&#xff0c;而对象的大小在类加载完成后已经确定了&#xff0c;所以分配内存只需要在Java堆中划分出一块大小相等的内存&#xff0c;JVM虚拟机中有…

Expository Essay写作有哪些详细攻略

我们留学生在进行Expository Essay写作前&#xff0c;首先需要懂得什么是“Expository”&#xff1f;说Expository的对象又是什么&#xff1f;本文小编就为大家带来比较详细的Expository Essay写作攻略&#xff0c;帮助不会写Expository Essay的同学们掌握写作方法。 何为Expos…

为什么说Java程序员都要学习JVM?阿里架构师分享JVM学习教程

如果你这辈子只甘心做一个平庸的Java码农&#xff0c;那么你完全没有必要去学习JVM相关的知识&#xff0c;学习JVM对于一个Java程序员的好处大概可以概括为下几点&#xff1a;1&#xff09;你能够明白为什么Java最早期被称为解释型语言&#xff0c;而后来为什么又被大家叫做解释…

MySQL的select语句

SQL概述 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩荡的波…

期货穿透式监管实质(期货看穿式监管)

期货量化交易编程怎么弄 1、CTP&#xff0c;从程序化接入CTP同时支持四大交易所&#xff0c;并且性能优越。 2、穿透式监管&#xff0c;所谓穿透式监管是对比之前的非穿透式监管&#xff0c;所有的接口都要采用新的标准&#xff0c;即官方公布的穿透式监管API。 3、登陆网址…

算法---分组的最大数量

题目 给你一个正整数数组 grades &#xff0c;表示大学中一些学生的成绩。你打算将 所有 学生分为一些 有序 的非空分组&#xff0c;其中分组间的顺序满足以下全部条件&#xff1a; 第 i 个分组中的学生总成绩 小于 第 (i 1) 个分组中的学生总成绩&#xff0c;对所有组均成立…

【JavaWeb的从0到1的构建知识体系(四)】认识Mybatis(上)

认识Mybatis 在前面JDBC的学习中&#xff0c;虽然我们能够通过JDBC来连接和操作数据库&#xff0c;但是哪怕只是完成一个SQL语句的执行&#xff0c;都需要编写大量的代码&#xff0c;更不用说如果我还需要进行实体类映射&#xff0c;将数据转换为我们可以直接操作的实体类型&a…

6、堆(新生区,永久区,堆内存调优(jvm调优))

堆&#xff08;新生区&#xff0c;永久区&#xff0c;堆内存调优&#xff08;jvm调优&#xff09;&#xff09; 新生区&#xff1a; 类的诞生&#xff0c;成长。甚至死亡&#xff08;在幸存区也可能被Gc垃圾回收了&#xff09; 伊甸园区&#xff08;Eden Space&#xff09;&a…

洛谷千题详解 | P1016 [NOIP1999 提高组] 旅行家的预算【C++、Java、Python语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; Python源码&#xff1a; ------------------------------------------------------------------------…

Openstack:创建实例

Openstack&#xff1a;创建实例 创建实例前需要准备好三个工作&#xff1a;镜像、网络、实例类型。 网络创建会在另外一篇文章列出&#xff0c;下面主要讲实例类型和镜像相关的操作。 实例类型&#xff08;flavor&#xff09; 看到这个图应该很容易理解了&#xff0c;就是定义…

受激拉曼散射计量【Stimulated-Raman-Scattering Metrology】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

R语言代做电信公司churn数据客户流失 k近邻(knn)模型预测分析

全文链接&#xff1a;http://tecdat.cn/?p5521 原文出处&#xff1a;拓端数据部落公众号 Data background A telephone company is interested in determining which customer characteristics are useful for predicting churn, customers who will leave their service. …

msf手机渗透二(实现外网渗透)

目录 一、思路概述 二、实现步骤 1.测试主机连通性 2.注册账号并开通隧道 2.下载客户端 ​编辑 3.配置客户端 4.生成App 5、启动msfconsole 1.加载模块 2.设置payload监听 3.设置options 6.使用 一、思路概述 在内网穿透官网注册飞鸽内网穿透开通隧道&#xff0c;然…

内存取证系列2

因为本地保存的图片,每次发出来,还需要一个一个重新上传校对&#xff0c;就很麻烦,文章6月就写完了。实在是上传太累了。 文章目录文档说明挑战说明解题过程flag 1查看系统查看进程查看命令提示符输出信息查看命令行历史记录查看数据库文件虚拟地址 并提取john破解该文件扫描常…

MySQL 慢查询经典案例分析

案例1&#xff1a;隐式转换 创建 user 表&#xff0c;并且添加 user_id 索引 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,user_id varchar(32) NOT NULL,age varchar(16) NOT NULL,name varchar(255) NOT NULL,PRIMARY KEY (id),KEY idx_userid (user_id) USIN…

zlMediaKit 11 rtsp相关--分包/sdp信令交互/排序

RtspSpliter 结构 bool _enableRecvRtp false; //是否允许收到rtpbool _isRtpPacket false; //包是否是rtp包Parser _parser; //jie重写了HttpRequestSpliter ssize_t onRecvHeader(const char *data,size_t len) override; void onRecvContent(const char …

如何将硬盘克隆到固态硬盘,固态硬盘系统克隆怎么弄

磁盘克隆是指把源磁盘所有存储数据&#xff0c;包括操作系统、应用程序以及文件文档等全部复制到目标盘&#xff0c;使得新硬盘替代旧硬盘。 一般而言&#xff0c;磁盘克隆具有独特的应用场景&#xff0c;例如&#xff0c;如果电脑磁盘的磁盘空间即将用尽&#xff0c;需要替换新…
最新文章