【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁

文章目录

  • 简述
  • 全局锁
    • ⭐数据备份
      • 设置全局锁
      • 对表进行备份
      • 释放锁
  • 表级锁
    • 表锁
      • ⭐读锁
      • ⭐写锁
    • 元数据锁
    • 意向锁
      • ⭐意向共享锁
      • ⭐意向排他锁
  • 行级锁
    • 行锁
    • 间隙锁&临键锁
  • 小结

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第1张图片

在 MySQL 中,锁是用于控制对数据的并发访问的机制。使用锁可以确保在多个用户同时访问相同数据时不会发生数据不一致或冲突的情况。MySQL 提供了多种类型的锁,以支持不同的并发访问场景。

以下是 MySQL 中常见的锁类型:

共享锁(Shared Lock):多个事务可以同时持有共享锁,并且不会互相阻塞。适用于读取操作,可以防止其他事务对数据进行写操作,但允许其他事务同时持有共享锁。

排他锁(Exclusive Lock):排他锁是一种独占锁,一个事务持有排他锁时,其他事务无法再持有任何类型的锁。适用于写入操作,可以防止其他事务对数据进行读取或写入操作。

行级锁(Row Lock):行级锁是针对表中的单行记录进行的锁定。MySQL 使用行级锁来实现并发控制,例如在事务中更新或删除某行数据时可以对该行加排他锁,阻止其他事务对该行进行修改。

表级锁(Table Lock):表级锁是针对整个表进行的锁定,会影响到整个表的并发访问。一般情况下,尽量避免使用表级锁,因为它会降低系统的并发性能。

除了以上常见的锁类型外,MySQL 还提供了其他类型的锁和锁机制,如意向锁、间隙锁等,用于支持不同的并发控制需求。

在实际开发中,了解不同类型的锁及其特性,合理地选择和使用锁对于确保数据的一致性和并发性能是非常重要的。同时,需要注意避免出现死锁等并发访问的常见问题。

简述

MySQL中的锁是用于控制并发访问和操作数据库的机制。锁的存在可以确保多个用户或进程在同时操作数据库时不会产生冲突或数据不一致的问题。MySQL支持不同级别的锁,包括表级锁和行级锁。

全局锁

就说对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML语句,DDL语句,已经更新操作的事务提交语句都将被阻塞
可以查询,但是不能写

⭐数据备份

设置全局锁

flush tables with read lock;

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第2张图片
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第3张图片

对表进行备份

在这里插入代码片

注意
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第4张图片

执行语句后,发现会报错
这是因为mysqldump是MySQL提供的工具,我们不应该在MySQL的命令行里面执行,我们应该在Windows的命令行里面执行


【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第5张图片
我们进入路径,发现备份成功了
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第6张图片

释放锁

unlock tables;

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第7张图片

表级锁

表级锁,每次操作锁住整张表,锁定粒度大,发生锁冲突的概率最高,并发度最低

表锁

表锁是数据库中一种常见的锁机制,它可以保护整张表免受并发操作的影响。当一个事务请求对某个表进行修改时,数据库管理系统会获取一个表级锁,将该表标记为“正在修改”。这样,其他事务就无法同时进行与该表相关的操作,直到持有锁的事务释放锁为止。

⭐读锁

在数据库系统中,读锁通常应用于表或行级别。当事务需要读取某个表或行时,它会请求共享锁。如果该表或行没有被其他事务以排他方式锁定,那么事务将获得该资源的读锁,并且其他事务可以继续读取该资源,但不能写入。如果有一个或多个事务已经以排他方式锁定了该表或行,那么请求共享锁的事务将被阻塞,直到其他事务释放了锁。

⭐写锁

在数据库系统中,写锁通常应用于表或行级别。当事务需要对某个资源进行写操作时,它会请求排他锁。如果该资源没有被其他事务以共享方式锁定或排他方式锁定,那么事务将获得该资源的写锁,并且其他事务无法读取或写入该资源。如果有其他事务以共享方式锁定了该资源,或者已经有事务以排他方式锁定了该资源,那么请求排他锁的事务将被阻塞,直到其他事务释放了锁。


【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第8张图片

加了读锁,可以读,但是不能写,其他客户端如果写,会处于阻塞状态,直到本地客户端释放锁为止
加了写锁,本地客户端可以读写但是其他客户端不能读,不能写

读锁不会阻塞其他客户端的读,但是会阻塞写
写锁机会阻塞其他客户端的读,又会阻塞其他客户端的写

元数据锁

元数据锁 加锁过程是系统自动控制的,无需显式使用,在访问一张表的时候会自动加上
元数据锁的主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据锁进行写入操作
为了避免DML与DDL冲突,保证读写的准确性
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第9张图片
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第10张图片
直到commit为止
在这里插入图片描述

意向锁

意向锁(Intention Lock)是在数据库中用于保护行级锁和表级锁之间的一种锁机制。它不直接作用于数据,而是作用于锁的层次结构,可以协调行级锁和表级锁之间的关系,从而提高并发访问效率。

⭐意向共享锁

与表锁共享锁(read)兼容,与表锁排他锁(write)互斥

⭐意向排他锁

与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥

查看意向锁,行锁的加锁情况
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第11张图片

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高,应用在InnoDB存储引擎中

行锁

锁定单个行记录的锁,防止其他事务对此进行update和delete。在RC,RR隔离级别下都支持
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第12张图片

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第13张图片

间隙锁&临键锁

锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持
防止多个并发事务出现幻读![请添加图片描述](https://img-blog.csdnimg.cn/abfaed7061ee4a57af28137363f37360.jpeg)
【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第14张图片
但是当左侧客户端执行commit操作后,数据id=7可以进行插入

小结

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第15张图片

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁_第16张图片

你可能感兴趣的:(MySQL,数据库,mysql,锁,安全)