首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能锁在InnoDB表上呢?

为什么我不能锁在InnoDB表上呢?
EN

Database Administration用户
提问于 2012-03-02 08:19:10
回答 1查看 2.9K关注 0票数 2

我对lock命令有问题:LOCK TABLE v3_cam_date WRITE;,该命令总是以state:"Waiting for table metadata lock"运行。

使用命令试图找出哪个线程持有表v3_cam_date上的锁:

代码语言:javascript
复制
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个处于空闲状态的线程。

谢谢,

EN

回答 1

Database Administration用户

发布于 2012-03-02 21:27:28

根据MySQL关于元数据锁定的文档

如果服务器为语法上有效但在执行过程中失败的语句获取元数据锁,则不会提前释放锁。锁释放仍然推迟到事务结束,因为失败的语句被写入二进制日志,而锁保护日志的一致性。

一些人将此状态作为bug提交,但是bug报告声称它不是bug。

这两个链接都将DDL (数据定义语言)与表描述为一个促成因素。值得注意的是,在现实中,做类似于TRUNCATE TABLE的事情就是DDL。我们必须知道我们运行的任何SQL。当实际上是DDL时,我们可能会认为SQL是事务的一部分。截断TABLEis我们认为是DML的一个例子。这可能导致当前事务提交,并且在编写二进制日志事件时可能会产生不可预测的结果,如第一环节所述:

在MySQL 5.5.3之前,当事务为语句中使用的表获取元数据锁时,它在语句末尾释放锁。这种方法的缺点是,如果为另一个会话在活动事务中使用的表发生DDL语句,则可能会以错误的顺序将语句写入二进制日志。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/14254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档