什么是元数据锁?
其实在mysql 5.5.3开始之后的版本,针对innodb表,任何已经开始的事务将一直持有元数据锁,一直到事务提交,另外使用alter对表结构进行修改的时候,也会持有元数据锁,直到alter语句结束。
1、创建一张innodb引擎的测试表
插入2行数据
mysql> insert into db1 values(1,'小明'),(2,'小刚');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
2、开启A事务,进行对表查询
3、开启B事务,对表结构进行修改
可以看到alter语句被阻塞
4、执行show processlist;看到当前线程
小结:
在A事务中的select操作个db1表添加了元数据读锁,在B事务中alter table操作对db1表添加了元数据写锁,只有当A事务提交或者回滚,才会释放元数据读锁,B事务的alter操作才可以继续执行。
之前看到另外博主遇到MySQL版本为5.5,表是myisam引擎,做ddl时出现了Waiting for table metadata lock,myisam是非事务引擎,这个典型是一个问题,值得深思。
http://blog.csdn.net/cug_jiang126com/article/details/51698236