MySQL数据库锁

MySQL数据库锁

一:锁的概述

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。锁机制就是为了保证多用户并发操作时,能使被操作的数据源保持一致性的设计原则。

二:加锁的目的

对数据加锁是为了解决事务的隔离性问题,让事务之间相互不影响,每个事务进行操作的时候都必须先对数据加上一把锁,防止其他事务同时操作数据。

三:锁是基于什么实现的

在Innodb中我们的锁都是作用在索引上面的,当我们的SQL命中索引时,那么锁住的就是命中条件内的索引节点(行锁),如果没有命中索引的话,那我们锁的就是整个索引树(表锁)

四:锁的分类

数据库里有的锁有很多种,为了方面理解,所以我根据其相关性"人为"的对锁进行了一个分类,分别如下:
1、基于锁的属性分类:共享锁、排他锁。
2、基于锁的粒度分类:全局锁、表锁、行锁(记录锁、间隙锁、临键锁)。
3、基于锁的状态分类:意向共享锁、意向排它锁。

4.1、按照锁的属性分:

共享锁(Share Lock)

共享锁又称读锁,简称S锁。当一个事务对数据加上读锁之后,其他事务只能对该数据加读锁,而无法对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加写锁。
加了共享锁之后,无法再加排它锁,这也就可以避免读取数据的时候会被其它事务修改,从而导致重复读问题。
在这里插入图片描述

排他锁(eXclusive Lock)

排他锁又称写锁,简称X锁;当一个事务对数据加上写锁之后,其他事务将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁。加了排他锁之后,其它事务就无法再对数进行读取和修改,所以也就避免了脏写和脏读的问题。
在这里插入图片描述

4.2、按照锁的粒度分:

  1. 全局锁:锁定数据库中的所有表
  2. 表级锁:每次操作锁住整张表
  3. 行级锁:每次操作锁住对应的行数据
    全局锁
    全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句将被阻塞。
    其典型的使用场景是做全库的逻辑备份,对所有表进行锁定,从而获取一致性视图,保证数据的完整性。
    表锁
    表锁是指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问;
    特点: 粒度大,加锁简单,容易冲突
    在这里插入图片描述

行锁
行锁是对所有行级别锁的一个统称,比如下面说的记录锁、间隙锁、临键锁都是属于行锁, 行锁是指加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问;
特点:粒度小,加锁比表锁麻烦,不容易冲突,相比表锁支持的并发要高;
在这里插入图片描述
记录锁(Record Lock)
记录锁属于行锁中的一种,记录锁的范围只是表中的某一条记录,记录锁是说事务在加锁后锁住的只是表的某一条记录。
在这里插入图片描述
触发条件:精准条件命中,并且命中索引;

例如:update user_info set name=’张三’ where id=1 ,这里的id是索引。

记录锁的作用:加了记录锁之后数据可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题。
间隙锁(Gap Lock)
间隙锁属于行锁中的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,当表的相邻ID之间出现空隙则会形成一个区间
在这里插入图片描述
触发条件:范围查询,查询条件必须命中索引、间隙锁只会出现在REPEATABLE_READ(重复读)的事务级别中。

例如:对应上图的表执行select * from user_info where id>1 and id<4(这里的id是唯一索引) ,这个SQL查询不到对应的记录,那么此时会使用间隙锁。

间隙锁作用:防止幻读问题,事务并发的时候,如果没有间隙锁,就会发生如下图的问题,在同一个事务里,A事务的两次查询出的结果会不一样。
在这里插入图片描述

临键锁(Next-Key Lock)
临键锁也属于行锁的一种,并且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住,遵循左开右闭原则。

例如:下面表的数据执行 select * from user_info where id>1 and id<=13 for update ;
会锁住ID为5,10的记录;同时会锁住,1至5,5至10,10至15的区间。
在这里插入图片描述
触发条件:范围查询,条件命中了索引。

临键锁的作用:结合记录锁和间隙锁的特性,临键锁避免了在范围查询时出现脏读、重复读、幻读问题。加了临键锁之后,在范围区间内数据不允许被修改和插入。

4.3、按照锁状态分

状态锁说明
1、包括意向共享锁和意向排他锁,它们被区分为状态锁的核心逻辑。
2、这两种锁都是描述是否可以在某个表上添加表锁的状态。
当一项事务试图在整个表中加锁(共享锁或排锁)时,首先需要获得相应类型的意向锁(意向共享锁或意向共享锁)
意向共享锁
当一个事务试图在整个表格中添加共享锁时,首先需要获得该表格的意向共享锁。
意向排他锁
在一项事务试图将整个表格加排锁定之前,首先需要得到该表格的意向锁定。
状态锁的作用
innodb加锁的方法是基于索引,锁定粒度是行锁。意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值