一、粒度
全局锁
对整个数据库实例加锁 Flush tables with read lock (FTWRL) mysqldump使用参数--single-transaction,启动一个事务,确保拿到一致性视图,不要去锁整个实例。而由于MVCC的支持,这个过程中数据是可以正常更新的。
表级锁
表级锁分为表锁(lock tables … read/write;)和MDL锁(增删查改:MDL读锁;DDL语句:MDL写锁)
MDL锁
- 事务A拿到执行查询语句拿到MDL读锁
- 事务B同时执行DDL语句希望拿到MDL写锁,被事务A阻塞
- 此时读和写都不可行了,必须要A释放MDL读锁,B拿到MDL写锁并且提交事务后,其他事务才能重新拿到MDL读锁