前言
MySQL5.5版本开始引入了MDL锁用来保护元数据信息,让MySQL能够在并发环境下多DDL、DML同时操作下保持元数据的一致性。本文用MySQL5.7源码分析了常用SQL语句的MDL加锁实现。
MDL锁粒度
MDL_key由namespace、db_name、name组成。
namespace包含:
-
GLOBAL。用于global read lock,例如FLUSH TABLES WITH READ LOCK。
-
TABLESPACE/SCHEMA。用于保护tablespace/schema。
-
FUNCTION/PROCEDURE/TRIGGER/EVENT。用于保护function/procedure/trigger/event。
-
COMMIT。主要用于global read lock后,阻塞事务提交。(在DML的commit阶段也会获取COMMIT锁)
-
USER_LEVEL_LOCK。用于user level lock函数的实现,GET_LOCK(str,timeout), RELEASE_LOCK(str)。
-
LOCKING_SERVICE。用于locking service的实现。