深度解析数据库锁机制及其原理(附个人明白图解)

打印 上一主题 下一主题

主题 1040|帖子 1040|积分 3120

MySQL锁的根本分类及介绍

MySQL的锁家属分为三类:全局锁,表级锁,行级锁。每个锁又可以通过读锁和写锁分开明白。     
1. 全局锁

顾名思义,这个锁一旦设置上,那便对整个数据库(dababase)有效,通常情况下设置读锁,使整个数据库处于只可读,不可写的状态。
全局锁一般用于数据库备份,升级等大规模的改动,一般情况下不允许使用全局锁,因为全局锁还是比力伤害的,假如在锁期间需要写入数据,这将会影响业务的正常运行。有人说,可以进行主从库分离啊,主库写入不影响,从库加全局读锁,这将会导致主从延迟的情况。使用全局锁得慎用。

2. 表级锁

表级锁即操作表,单独对表操作,对没有加锁的其他表没有影响。
表级锁分为读锁,写锁,元数据锁,自增锁。
2.1 读锁

读锁:顾名思义,让该表处于只读不写的状态,任何写入的操作将失效。
2.2 写锁

写锁:该表可以写入,但是注意,当有数据写入时,会将整张表锁起来,使得其他会话处于不可写的状态(不一定不可读,这得看隔离级别,我会在文章背面介绍隔离级别,这里先不解释),其他会话必须得比及该会话写入完毕,释放锁之后才华进行操作。这里不难明白吧,如何没有明白,可以看我绘制的一张图解。

2.3 元数据锁

元数据锁:元数据锁我明白为自动锁,就是你不需要去指定哪个表是读,哪个是写,他会自动在读的时候加读锁,在写的时候加写锁,这个在日常编程中也提供了极大的遍历,他有效的包管了数据的安全。
2.4 自增锁

自增锁:在自增字段自增的时候会调用这个锁,这个锁包管了数据在自增时的自增数据的安全。自增锁一般都是写锁,也就是在自增的时候不允许其他事件同时进行写的操作。

3. 行级锁

首先我们得知道,行级锁只有在InnoDB引擎下才会存在,MyISAM引擎下没有行级锁,这也导致了为什么InnoDB多线程相对于MyISAM更安全,因为InnoDB有行级锁。
InnoDB锁的原理是在索引上加锁
我们再来说说行级锁的类型:记载锁,间隙锁,临键锁,插入意向锁
3.1 记载锁

加上记载锁后,可以根据索引锁住该行的数据。这里我们得分情况,将索引分为主键索引和辅助索引。我们之前讲过,mysql数据库底层原理及查询优化提升速度题目总结-CSDN博客,大家如果不明白引擎底层,可以看看这篇文章,也是我写的哈哈哈哈。辅助索引底层的B+树中value并不是数据自己,而是该行对应的主键。
以是,如果索引是主键索引,那么这个记载锁是读锁(s锁/共享锁)大概是写锁(x锁/排他锁),他的锁都是加在主键索引上的。
但是请注意,如果该索引是辅助索引,那么这个记载锁是读锁时,那么这个锁先加在辅助索引上面,然后根据辅助索引对应的B+树检索到主键,之后在进行判断是否需要在主键上额外加锁,如果是读锁,那么主键上不需要额外加记载锁,因为读锁(共享锁)不会制止其他事件读取数据,如果是写锁,即在进行更新或删除操作时,InnoDB需要确保数据的一致性和完备性,因此它会在主键索引上再放置一个写锁(排他锁)。这样可以防止其他事件在你操作的行上进行任何修改。
到这里不知道大家明白了吗?总结一下,判断是读锁,还是写锁,读锁则不需要额外创建锁,写锁需要在主键索引上额外创建写锁。

3.2 间隙锁

我们知道,各个数据直接不是连续的,即使是连续的id数据之间也不是连续的,他们之间有间隙,那么这部门间隙就会导致插入数据时读写差异步,这是加一个间隙锁就可以办理该题目。间隙锁重要用于防止在可重复读(Repeatable Read)或更高级别的隔离级别下出现的幻读(Phantom Read)题目。
间隙锁一般都是写锁,它位于上一个数据之后,下一个数据之前,即数据之间的间隙,请注意哦,这里是开区间。
加上间隙锁后,可以
3.3 临键锁

一个一个数据和间隙的加锁服从太低且繁琐,那么有没有更方便的锁呢?当然有,那就是临键锁。
临键锁就是一个左开右闭的范围锁。左开,是因为最左边是间隙,以是是开区间,右闭,是最右边是数据,以是是闭区间。临键锁一般是写锁。
优点:
防止幻读,确保事件的隔离性。
在某些情况下,可以提供比行锁更高的并发性。

限制:
在高并发场景下,临键锁可能会增加锁的开销,导致性能下降。
实现临键锁的复杂度较高,需要数据库管理系统内部有相应的支持。
3.4 插入意向锁

上述的临键锁有个题目,假如临键锁范围很大,那么在这个锁没有被释放前,是不是其他的事件的插入操作都会被阻塞(因为间隙都被临键锁给锁住了)。在这种情况下,就可以使用插入意向锁。
插入意向锁是一种低级别的锁,它被事件在准备插入新行到数据表中时设置。这种锁的目标是为了告知其他事件,当前事件有意向在某个索引键值对应的行之间插入新行,从而在插入操作发生之前防止其他事件对这些行进行修改。
简单明白,插入意向锁就是一个只允许自己插入数据的间隙锁。在本事件插入数据时,对于其他事件相当于间隙锁,无法插入数据。当然,少部门情况下可能会涉及更新和删除,这里不过多赘述,原理差不多。
优点:
提高并发性,允很多个事件同时进行插入操作。
预先锁定可能影响的行,减少冲突。
限制:
在高并发场景下,如果插入操作频仍,可能会增加锁的开销。
插入意向锁的实现需要数据库管理系统内部有相应的支持。

3.5 其他锁

与插入意向锁相关的锁有很多,好比共享意向锁,排他意向锁,原理和插入意向锁大同小异,各位如果明白了插入意向锁,其他的意向锁肯定都能举一反三的。
乐观锁,灰心锁。这两个锁一个是假设冲突很少发生,假设最好的计划;一个是假设冲突很常见,做了最坏的计划。
多版本并发控制(MVCC)锁:MVCC机制下,每个数据行可能有多个版本。读取操作可以查看数据的历史版本,而写入操作会创建新的数据版本。
差异类型的锁在差异的数据库管理系统(DBMS)中可能有差异的实现和名称,但它们的根本目标是相似的:确保数据的一致性和隔离性,同时允许并发访问。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表