MySQL metadata鎖實驗

feelpurple發表於2017-10-01
在對已經存在的表執行DDL語句(例如更改表結構、DROP表等操作)的時候,如果有與這個表相關聯的事務沒有提交,就會產生metadata鎖等待。
這個時候,需要提交與這張表相關聯的事務,才會將metadata鎖釋放。

建立一張表

mysql> CREATE TABLE `travelrecord` (
    ->        `id` bigint(20) NOT NULL,
    ->        `user_id` varchar(100) DEFAULT NULL,
    ->        `traveldate` date DEFAULT NULL,
    ->        `fee` decimal(10,0) DEFAULT NULL,
    ->        `days` int(11) DEFAULT NULL,
    ->        PRIMARY KEY (`id`)
    ->      ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.09 sec)

會話一
開啟一個事務,查詢新建立的表
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from travelrecord;
Empty set (0.00 sec)
會話二
drop剛剛建立的表,會發生鎖等待
mysql> drop table travelrecord;


會話一
查詢會話
mysql> show processlist;
+----+------+-----------------+------+---------+------+---------------------------------+-------------------------+
| Id | User | Host            | db   | Command | Time | State                           | Info                    |
+----+------+-----------------+------+---------+------+---------------------------------+-------------------------+
|  3 | root | 127.0.0.1:34875 | sale | Query   |    0 | init                            | show processlist        |
| 24 | root | 127.0.0.1:34876 | sale | Query   | 1058 | Waiting for table metadata lock | drop table travelrecord |
+----+------+-----------------+------+---------+------+---------------------------------+-------------------------+
2 rows in set (0.00 sec)

提交事務
mysql> commit;
Query OK, 0 rows affected (0.03 sec)

會話二
鎖釋放,DROP語句順利執行
mysql> drop table travelrecord;
Query OK, 0 rows affected (58 min 40.02 sec)

資料庫中沒有了鎖
mysql> show processlist;
+----+------+-----------------+------+---------+------+-------+------------------+
| Id | User | Host            | db   | Command | Time | State | Info             |
+----+------+-----------------+------+---------+------+-------+------------------+
|  3 | root | 127.0.0.1:34875 | sale | Sleep   |   76 |       | NULL             |
| 24 | root | 127.0.0.1:34876 | sale | Query   |    0 | init  | show processlist |
+----+------+-----------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-2145655/,如需轉載,請註明出處,否則將追究法律責任。

相關文章