我对lock命令有问题:LOCK TABLE v3_cam_date WRITE;,该命令总是以state:"Waiting for table metadata lock"运行。
使用命令试图找出哪个线程持有表v3_cam_date上的锁:
SHOW OPEN TABLES FROM reportingdb
LIKE '%v3_cam_date';
Database Table In_use Name_locked
reportingdb v3_cam_date 0 0(In_use=0 =>没有任何锁)。
而且我不能只在表v3_cam_date上获得写锁,而可以在其他表上获得写锁。
尝试显示完整的PROCESSLIST;返回大约30个处于空闲状态的线程。
谢谢,
发布于 2012-03-02 21:27:28
根据MySQL关于元数据锁定的文档
如果服务器为语法上有效但在执行过程中失败的语句获取元数据锁,则不会提前释放锁。锁释放仍然推迟到事务结束,因为失败的语句被写入二进制日志,而锁保护日志的一致性。
一些人将此状态作为bug提交,但是bug报告声称它不是bug。。
这两个链接都将DDL (数据定义语言)与表描述为一个促成因素。值得注意的是,在现实中,做类似于TRUNCATE TABLE的事情就是DDL。我们必须知道我们运行的任何SQL。当实际上是DDL时,我们可能会认为SQL是事务的一部分。截断TABLEis我们认为是DML的一个例子。这可能导致当前事务提交,并且在编写二进制日志事件时可能会产生不可预测的结果,如第一环节所述:
在MySQL 5.5.3之前,当事务为语句中使用的表获取元数据锁时,它在语句末尾释放锁。这种方法的缺点是,如果为另一个会话在活动事务中使用的表发生DDL语句,则可能会以错误的顺序将语句写入二进制日志。
https://dba.stackexchange.com/questions/14254
复制相似问题