锁
- 1.概述
- 2.全局锁
- 3.表级锁
- 3.1 介绍
- 3.2 表锁
- 3.3 元数据锁
- 3.4意向锁
- 4.行级锁
1.概述
- 分类
按锁的粒度分类:
- 全局锁:锁住数据库中所有表
- 表级锁:每次操作锁定整张表
- 行级锁:每次操作锁定对应的行数据
2.全局锁
- 介绍
全局锁就是对整个数据库加锁,加锁后整个实例就处于就读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
其典型的使用场景就是做全库的逻辑备份,对所有的表进行锁定,从而获取一致视图,保证数据的完整性。
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)mysql> use test;
Database changed
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
C:\Users\Tracy>mysqldump -u root -p123456 test >D:/test.sql
- 特点
数据库加全局锁,是一个比较重的操作,存在以下问题:
- 如果在主库备份,那么在备份期间都不能执行更新,业务基本停摆。
- .如果在从库备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。
在innoDB引擎中,我们可以备份时加上参数–single-transaction参数来完成不加锁的一致性数据备份。
C:\Users\Tracy>mysqldump --single-transaction -u root -p123456 test >D:/test.sql
3.表级锁
3.1 介绍
每次操作锁住整张表,锁粒度大,发生锁冲突概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。
对于表级锁,主要分为以下三类:
1.表锁
2.元数据锁(meta data lock ,MDL)
3.意向锁
3.2 表锁
表共享读锁 (read lock)
表独占写锁 (write lock)
- 语法:
加锁:lock tables 表名 …read/write。
释放锁:unlock tables /客户端端口连接。
3.3 元数据锁
3.4意向锁
mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
4.行级锁