MySQL 的锁可以分为全局表、表级表和行锁三类。
全局锁
加全局读锁,整个数据库处于只读状态,可以用于数据库备份
flush tables with read lock
利用重复读隔离级别,可以避免加全局锁
mysqldump --single-transaction
不推荐使用 set global readyonly=true
使整库处于只读状态
- readonly 可能用于主从角色判断
- 客户端意外断开连接后,全局锁会自动释放;而 readonly 不会自动恢复
表级锁
MySQL 有两种表级锁,分别是表锁和元数据锁
表锁
表锁语法,客户端连接断开也会释放锁
lock tables t1 read/write lock
unlock tables
元数据锁
MySQL 5.5 引入元数据锁(meta data lock,MDL)。对于表做增删改查加 MDL 读锁,对表做表结构变更加 MDL 写锁,以保证表结构变更的安全性。
申请MDL锁会形成队列;
线程1执行 CRUD 获取元数据锁,线程2执行表结构获取元数据锁时会被阻塞,之后其他线程获取元数据读锁也会被阻塞(被线程2阻塞)
- 通过
information_schema.innodb_trx
查询是否有长事务,解决长事务 - 对于热点表,获取元数据写锁应该要有超时时间,避免阻塞后面的 CRUD 语句
- MySQL 5.6 Online DDL
这里使用队列应该是类是公平锁机制,使 CRUD 能够 FIFO。
标签:tables,MDL,lock,线程,MySQL,表和表锁,全局 From: https://www.cnblogs.com/liaozibo/p/18463672