序
根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁、行锁
全局锁
当需要让整个库处于只读状态的时候,需要对整个数据库实例加锁,典型场景是做全库逻辑备份。
MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)
表锁
表锁有两种
-
表锁
lock tables … read/write。与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。 -
元数据锁
在 MySQL 5.5 版本中引入了 MDL,当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。
MDL 不需要显式使用,在访问一个表的时候会被自动加上。
MDL 会直到事务提交才释放,在做表结构变更的时候,你一定要小心不要导致锁住线上查询和更新。
网友评论