锁的目的是为解决并发问题,根据加锁的范围,可将锁分为全局锁、表级锁、行锁。
全局锁
可通过FTWRL(Flush tables with read lock)对整个数据库实例加全局锁,使数据库处于只读状态,无法对数据进行更新(增、删、改)、表的DML/DDL操作等。
全库逻辑备份可使用全局锁,此时数据库处于只读状态,会影响业务,故对于支持事务的存储引擎,可通过使用mysqldump工具的single-transaction参数,保证能够拿到一致性视图。
表级锁
表级锁可分为:表锁、元数据锁(meta data lock,MDL))。
- 表锁
通过lock tables进行锁表,此时别的线程无法进行读写,本线程访问也受限。如:lock tables t1 read, t2 write; 本线程只能读t1、写t2,无法做除次之外的任何操作,如写t1等。故锁表影响的是整个表,影响范围过大。 - MDL
当修改表结构时,加MDL写锁;对数据进行修改时,加MDL读锁,
本文为《MySQL实战45讲》学习笔记