目录

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写锁。

行锁功过:怎么减少行锁对性能的影响?