python MYSQLdb 默认关闭 autocommit,任意执行一个 select * from user 语句,对于 MYSQL 5.5 以上的版本,都会造成 METADATA LOCK 阻塞。如下
select * from user;
alter table user ......; -- 阻塞 METADATA LOCK
select * from user; -- 阻塞 METADATA LOCK
结论:
-
select /update /delete 都会作为事务,事务就会出发 METADATA LOCK
-
alter table 也会申请 METADATA LOCK,但是会立即释放
这是python的Mysqldb库默认的事务形式触发执行机制的结果,默认关闭了autocommit所以执行会有未提交事务导致锁表