目录
介绍:锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,锁冲突也是影响数据库并发访问性能的一个重要因素。锁对数据库极为重要,也更为复杂
全局锁
介绍:对数据库实例加锁,加锁后实例只能为只读状态,使用场景是做全库的数据备份,对所有的表进行锁定,从而获取一致性视图,保证数据库的完整性
相关操作语句
#添加全局锁
flush table with read lock
特点:
1.如果在主库上备份,那么备份期间都不能执行更新,业务基本停滞
2.如果在主库上备份,那么备份期间从库不能执行主库同步过来的日志,会导致主从延迟
表级锁
介绍:每次操作时锁住整张表,锁定力度大,发生锁冲突的概率最高,并发低,在Innodb,MyISAM,BDB等存储引擎中。
对于表锁,分为:
1.表共享读锁
2.表独占写锁
语法:
#加锁
lock tables 表名 read/write
#释放锁
1.unlock tables
2.断开客户端连接
注:读锁不会阻塞其他客户端的读,但会阻塞写,写锁会阻塞其他客户端的读和写。
元数据锁(简称MDL)
元数据锁的加锁过程是系统自动控制,在访问时自动添加。元数据锁主要作用是维护表数据的数据一致性,在表上有活动事务是,不可能对元数据进行写入操作。为避免DML(数据操纵语句)和DDL(数据定义语句)冲突,保证读写正常
#查看元数据锁语句
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
意向锁
为避免DML在执行时,加的行锁和表锁的冲突,在Innodb中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查
步骤 一
步骤二
查询意向锁的加锁情况:
select object_schema,object_name,index_name,lock_mode,lock_data from performance_schema.data_locks;
意向共享锁
与表锁共享锁兼容,与表锁排它锁互斥
由select...lock in share mode添加
意向排它锁
与表锁共享锁及排它锁都互斥,意向锁之间不会互斥
由insert、update、delete 、 select...for update添加
行锁
Innodb实现了两种类型的行锁:
1.共享锁:允许一个事务去读一行,阻止其他事物获得相同数据集的排它锁
2.排它锁:允许获取排它锁的事务更新数据,阻止其他事物获得相同数据集的共享锁和排它锁
共享锁与排它锁之间的兼容情况:
正常情况下执行语句所加的锁:
默认情况下,Innodb在可重复读隔离级别下运行,Innodb使用next-key锁(临键锁)进行搜索和扫描,防止幻读。
1.针对唯一索引进行检索是,对已存在的记录进行等值匹配时,将自动优化为行锁。
2.行锁是针对索引的,不通过索引条件检索数据时,对升级为表锁
#查询行锁的加锁情况查询
select object_schema,object_name,index_name,lock_mode,lock_data from performance_schema.data_locks;
间隙锁(gop lock)
锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事物在这个间隙进行insert,产生幻读。在可重复读隔离级别下都支持,间隙锁可以共存
临键锁(next-key lock)
行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙,在可重复读下支持
默认情况下,Innodb在可重复读事物隔离级别运行,Innodb使用临键锁进行搜索和索引扫描,以防幻读。
1.索引上的等值查询(唯一查询),给不存在的记录加锁时,优化为间隙锁
2.索引上的等值查询(普通查询),向右遍历时最好一个值不满足查询需求是,临键锁退化为间隙锁
3.索引上的范围查询(唯一查询),会访问到不满足条件的第一个值为止
间隙锁唯一目的是防止其他事物插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一个事务在同一间隙上采用间隙锁