MySQL 全局表和表锁

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。

posted @ 2024-10-15 20:22  廖子博  阅读(12)  评论(0编辑  收藏  举报