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

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)中可能有不同的实现和名称,但它们的基本目的是相似的:确保数据的一致性和隔离性,同时允许并发访问。

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值