浅谈mysql中的那些琐

读锁和写锁 

一种对行为的抽象描述,主流数据库引擎都是select为读锁,update/delete/insert为写锁

表锁

顾名思义,锁住整张表的数据

 行锁

锁住数据所在行。

表锁和行锁对比:
性能:表锁<行锁
锁的速度:表锁>行锁(表数据越大,开销越大,需找到表中所在行的数据,进行锁定)

 共享锁

查询数据时,会对其加锁,期间可以有其它的读操作进入。(即共享锁之间可以共存)

排它锁

写入操作时,对数据进行的加锁处理,期间不允许其它请求访问锁定的数据

 意向锁

意向是指一种行为的表现,方便表锁前进行判断。如,要进行表锁,正常来说需要判断表中所有记录都没有锁,
才行进行表锁,这样非常耗时。而意向锁,则解决这一问题,再进行排它锁或共享锁时,会先给表上加一个锁,
也可以理解为一个操作的标记,当需要进行表锁时,直接判断表上是否有对应的意向锁,就可进行相应的操作

 假设数据表记录为如下

id: 1   5  8  11 4条记录

记录锁

按照键位查询。适用于匹配单个字段数值
即:
1、5、8、11
锁定当前记录,如where id =1 锁住id为1 的记录

间隙锁

按照键位将数据分为左开右开的区间范围。适用于匹配单个字段数值
即:
(-无穷,1)、1、(1,5)、5、(5,8)、8、(8,11)、11、(11,+无穷)

锁住记录之间的访问缝隙,如where id = 3,会锁住(1,5)间的数据模块

临键锁

按照键位将数据分为左开右闭的区间范围。
即:
(-无穷,1]、(1,5]、(5,8]、(8,11]、(11,+无穷)

锁住下一个最近键的范围,用于范围查询,如:where id > 6 and id < 10其锁住的范围是(5,11]

 锁到底锁住的是什么?

本文只做记录,不做验证,感兴趣的小伙伴可自行研究:
锁,锁住的是索引,因为我们查找数据都是按照索引去进行数据的检索。否则就是全表扫描。

 表中无索引会产生锁吗?

这是一个伪命题。
首先,表中无索引这句话有不同的观点。
依据数据库的原理,表所有字段不建立任何索引的情况下,数据库会依照记录的行号进行类似索引的操作。

其次,当产生锁的时候,没有索引,回去将记录的行号当做索引进行锁定
原创文章 148 获赞 258 访问量 11万+

猜你喜欢

转载自blog.csdn.net/yxh13521338301/article/details/106012048