个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
锁
:
锁的分类
:
全局锁
:锁定数据库中所有的表。表级锁
:每次操作锁住整张表。行级锁
:每次操作锁住对应的行数据。全局锁
:
DML
的写语句,DDL
语句,已经更新操作的事务提交语句都将被阻塞。其典型的使用场景是:做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性 。设置全局锁:
FLUSH TABLES WITH READ LOCK;
MySQL数据备份:
# MySQL数据库备份的 (命令行指令)
mysqldump -uroot -p密码 备份数据库名>保存备份的文件名
# 实例:
# mysqldump -uroot -p123456 mydb>mydb.sql
解除全局锁:
UNLOCK TABLES;
表级锁
:
表级锁分类
:
①表锁 :表共享读锁(read lock
) / 表独享写锁(write lock
)
-- 设置表锁
-- 设置了读锁read lock,当前客户端和其他客户端都只能读不能写。
-- 设置了写锁write lock,当前客户端对当前表可读可写,其他客户端不能读不能写。
LOCK TABLES 表名1[,表名2,...] {READ | WRITE};
-- 释放锁
UNLOCK TABLES;
读锁不会阻塞其他客户端的读操作,但会阻塞写操作。写锁即阻塞其他客户端的读操作又阻塞其他客户端的写操作
②元数据锁(meta data lock,MDL) :
⚪MDL加锁过程是系统自动控制 ,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性 ,在表上有活动事务的时候,不可以对元数据进行写入操作。作用
:为了避免DML与DDL冲突,保证读写的正确性。
⚪在MySQL5.5
中引入了MDL
,当对一张表进行增删改查的时候,加MDL读锁(共享) ;当对表结构进行变更操作的时候,加MDL写锁(排他) 。
-- 查看元数据锁
select object_type,object_schema,object_name,lock_type,lock_duration from
performance_schema.metadata_locks ;
③意向锁 :
为了避免DML语句在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
⚪意向共享锁(IS) :与表锁共享锁(read)兼容,与表锁排它锁(write)互斥。
⚪意向排他锁(IX) :与表锁共享锁(read)及排它锁(write)都互斥。意向锁之间不会互斥。
-- 查看意向锁加锁情况
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema.data_locks;
-- 添加意向共享锁(IS)
SELECT语句 LOCK IN SHARE MODE;
-- 添加意向排他锁(IX)
{INSERT语句 | UPDATE语句 | DELETE语句 | SELECT语句}
FOR UPDATE;
行级锁
:
InnoDB
存储引擎中,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高 。InnoDB
的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:行锁(Record Lock)
:update
和delete
操作。在RC、RR隔离级别下都支持。间隙锁(Gap Lock)
:insert
操作,产生幻读。在RR隔离级别下支持。临键锁(Next-Key Lock)
:行锁执行原理
:
默认情况下,InnoDB
在REPEATABLE READ
事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。
查看 行锁/意向锁 加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema.data_locks;
间隙锁 / 临键锁 执行原理
:
默认情况下,InnoDB
在REPEATABLE READ
事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。