MySQL:锁
目录
全局锁和表锁 :给表加个字段怎么有这么多阻碍?
根据加锁范围,MySQL里面的锁大致可以分为全局锁、表级锁和行锁三类。
全局锁
全局锁就是对整个数据库实例加锁。当需要让整个库处于只读状态的时候,可以使用命令Flush tables with read lock(FTWRL)
,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的使用场景就是全库逻辑备份。
注意:官方自带的逻辑备份工具mysqldump。当使用参数
-single-transaction
的时候,导数据前会启动一个事务,确保拿到一致性视图。
一致性读虽然好,但是有的引擎(例如MylSAM)就不支持这个隔离级别,所以-single-transaction
方法只适用于所有的表使用事务引擎的库。
表级锁
MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock, MDL)。
- 表锁
表锁语法是lock tables ... read/write
。可以用unlock tables
主动释放锁,也可以在客户端断开的时候自动释放。但是对于支持更细粒度(行锁)的引擎(InnoDB)来说,一般不使用lock tables命令来控制并发。
- MDL
MDL不需要显式使用,在访问一个表的时候会自动加上,作用是保证读写正确性。当对一个表做增删改查操作的时候,加MDL读锁;当对表结构变更操作的时候,加MDL写锁。