写在前面
大家好,这里是立志于在有生之年看到并参与通用人工智能开发工作的Nobody,由于最近在公司要经常性地接触大数据工具,所以打算开一个大专栏对大数据工具进行学习总结整理。这部分接着之前的MySQL基础篇,接下来将对MySQL进阶部分进行学习。
以下为该部分的前置博客
一、全局锁
-
锁:锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。按照锁的粒度分,分为以下三类
- 全局锁:锁定数据库中的所有表
- 表级锁:每次操作锁住整张表
- 行级锁:每次操作锁住对应的行数据
-
全局锁是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,以及更新操作的事务提交语句都将被阻塞
-
语法
flush tables with read lock; -- 施加全局锁 mysqldump uroot -p1234 itcast>itcast.sql -- 数据备份 unlock tables; -- 解锁 -
特点:数据库中加全局锁,是一个比较重的操作,存在以下问题
- 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆
- 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟
二、表级锁
-
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低
-
表锁
- 表共享读锁(read lock):只能读不能写,且不会阻塞其他客户端的读操作,但会阻塞其他客户端的写操作
- 表独占写锁(write lock):对于当前客户端,既能读也能写,对于其他客户端,既不能读也不能写。
- 语法:
- 加锁:lock tables 表名 read/write
- 释放锁:unlock tables
-
元数据锁(meta data lock,MDL):MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用就是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。以下标为为MDL类型及其对应SQL语句
对应SQL 锁类型 说明 lock tables xxx read/write SHARED_READ_ONLY/SHARED_NO_READ_WRITE select、select ... lock in share mode SHARED_READ 与SHARED_READ、SHARED_READ兼容,与EXLUSIVE互斥 insert、update、delete、select ... for update SHARED_READ 与SHARED_READ、SHARED_READ兼容,与EXLUSIVE互斥 alter table EXLUSIVE 与其他的MDL互斥 同样可以查看元数据锁
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks; -
意向锁:为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
- 意向共享锁:由语句select ... lock in share mode添加。与表锁共享锁兼容,与表锁排他锁互斥
- 意向排他锁:由insert、update、delete、select ... for update添加。与表锁共享锁及排他锁互斥,意向锁之间不会互斥
三、行级锁
-
行级锁:每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,对于行级锁,主要分为以下三类
-
行锁:锁定单个行记录的锁,防止其他事务对此行进行update和delete操作
- 共享锁:允许一个事务去读一行,组织其他事务获得相同数据集的排他锁
- 排他锁:允许获取排他锁的事务更新数据,组织其他事务获得相同数据集的共享锁和排他锁
SQL 行锁类型 说明 insert 排他锁 自动加锁 update 排他锁 自动加锁 delete 排他锁 自动加锁 select 不加任何锁 select ... lock in share mode 共享锁 需要手动在select后面加lock in share mode select ... for update 排他锁 需要手动在select后面加for update -
间隙锁:锁定索引记录间隙,确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁
-
临键锁:行锁和间隙锁结合,同时锁住数据,并锁住数据前面的间隙Gap
-