MySQL中常见的锁
目录
前言
关于 锁的概述
锁的分类
锁的应用场景
锁使用
全局锁
表级锁
行级锁
前言
本篇博客,旨在介绍 全局锁和 表级锁,行级锁
关于 锁的概述
锁的分类
在MySQL数据库中,我们根据
锁的颗粒度的大小分为:全局锁,表级锁,行级锁。
锁的功能分为:读锁(共享锁),写锁(排斥锁)
锁的应用场景
总结:多个事务在进行并发操作时,保证数据的真实性,有效性。
锁使用
全局锁
全局锁范围最大,如果加了全局锁,就处于只读状态。表示你无法向任意数据库中的任意一张表插入,修改数据
其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
从图中,可知,加了全局锁后,只允许查询操作
语法--添加全局锁
flush tables with read lock;
语法--去掉全局锁
unlock tables;
导出数据
//mysqldump -uroot -p123456 test > D:/tb.sql
mysqldump -uroot-p密码 数据库名> 文件名.sql
案例
我现在打开两个mysql客户端模拟,两个事务的执行。左边一个事务加上全局锁;右边一个不加,对某张表进行查询或修改操作
- 可以发现,加了全局锁之后,右侧只允许查询数据,不允许修改或新增
- 去掉全局锁,就可以添加或修改数据
总结
数据库中加全局锁,是一个比较重的操作,存在以下问题:
1.如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
2.如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
解决办法:
在InnoDB引擎中,我们可以在备份时加上参数--single-transaction参数来完成不加锁的一致性数据备份
mysqldump --single-transaction -uroot-p123456 itcast> itcast.sql
表级锁
表级锁,每次操作锁住的是整张表
表级锁的分类:表锁,元数据锁,意向锁
表锁:1. 表共享读锁(readlock)2.表独占写锁(write lock)
语法:
//加锁
lock tables 表名 read/write。
//释放锁
unlock tables//或者关掉当前窗口,也会关闭
总结
1 如果你加了读锁,表示关于任何查询操作都可以正常进行,但修改/添加将被阻塞
- 绿色,可以执行的,红色,执行会阻塞
案例
在当前客户端中添加了共享读锁,但依旧可以进行读取操作,但是其他行为会被阻止
打开另外一个mysql客户端,发现即使添加了共享读锁,但依旧可以进行读取操作,但更新会被阻止,只有当把锁释放才行
共享读锁被释放,就可以执行更新操作
2 如果你加了写锁,只允许当前事务,进行读写操作,其他事务的任何操作会被阻塞
案例
给自身表加了写锁,观察 是否可以进行查询,修改操作
发现自身事务,不受影响,依旧可以进行读写操作,但其他事务会阻塞

行级锁
InnoDB实现了以下两种类型的行锁:
1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
2.排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
关于常见的sql语句,中添加的锁有:
默认情况下,InnoDB在REPEATABLEREAD事务隔离级别运行,InnoDB使用next-key【临键锁】锁进行搜索和索引扫描,以防止幻读。
行级锁的应用
可以通过以下SQL,查看意向锁及行锁的加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
1.针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
翻译这句话是:如果当前操作中主键索引【id】作为条件进行等值匹配,自动变换为行级锁
案例
2.InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。