Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql InnoDB何时超时而不是报告死锁?_Mysql_Innodb_Deadlock - Fatal编程技术网

Mysql InnoDB何时超时而不是报告死锁?

Mysql InnoDB何时超时而不是报告死锁?,mysql,innodb,deadlock,Mysql,Innodb,Deadlock,我有一个来自MySQL的“锁等待超时超过”错误,我无法复制或诊断。我确信这是死锁(与事务抓住锁然后转动拇指不同),因为我的日志显示另一个进程同时启动,也挂起,然后在第一个超时时继续。但通常情况下,InnoDB在不超时的情况下检测死锁。所以我试图理解为什么没有检测到这个死锁 这两个事务都使用可序列化的隔离级别。(我对这个隔离级别的InnoDB锁定有相当的了解。)事务中使用了一个非InnoDB(MyISAM)表,我将其插入并更新。但是,我不明白它是如何卷入死锁的,因为我认为MyISAM只是在插入和更

我有一个来自MySQL的“锁等待超时超过”错误,我无法复制或诊断。我确信这是死锁(与事务抓住锁然后转动拇指不同),因为我的日志显示另一个进程同时启动,也挂起,然后在第一个超时时继续。但通常情况下,InnoDB在不超时的情况下检测死锁。所以我试图理解为什么没有检测到这个死锁

这两个事务都使用可序列化的隔离级别。(我对这个隔离级别的InnoDB锁定有相当的了解。)事务中使用了一个非InnoDB(MyISAM)表,我将其插入并更新。但是,我不明白它是如何卷入死锁的,因为我认为MyISAM只是在插入和更新期间获取一个表锁(然后立即释放它,因为MyISAM不是事务性的),所以在持有该表锁时不会获取其他锁

所以我确信死锁只涉及InnoDB表,这让我回到了为什么它没有被检测到的问题。MySQL文档(http://dev.mysql.com/doc/refman/5.1/en/innodb-deadlock-detection.html)这意味着死锁检测几乎总是有效的。我在搜索时发现的问题案例包括显式的“锁定表”、“更改表”和“插入延迟”。我没有做任何这些事情,只是插入、更新和选择(我的一些选择是“用于更新”)

我试图通过创建一个MyISAM表和两个InnoDB表,在MyISAM中执行各种插入和更新序列,并在InnoDB中执行“选择更新”来复制。但每次我出现死锁时,InnoDB都会立即报告。我无法重现超时


还有其他诊断方法吗?我使用的是mysql 5.1.49。

一个技巧是,您可以使用
显示INNODB状态
来显示INNODB引擎的状态,您猜对了

它返回的信息(一大块文本)包括关于当前表锁的信息,以及上次检测到的死锁的信息(在标题
“LATEST detected deadlock”
下),因此这个技巧在事后并没有那么有用,但它可以帮助您在发生挂起查询时跟踪它

mysqladmin debug
还可以打印有用的锁调试信息

第三个技巧是创建一个名为
innodb\u lock\u monitor
的神奇命名表,如中所述,该表提供了更详细的锁调试

更新:

它可能没有检测到死锁,因为它实际上不是死锁,但更有可能是一个进程正在等待另一个进程锁定的行上的行锁。从变量的手册中:

InnoDB中的超时(以秒为单位) 事务可能会等待行锁定 在放弃之前。默认值为 50秒。尝试的事务 访问由锁定的行的步骤 另一个InnoDB事务将挂起 最多在这几秒钟之前 发出以下错误:

错误1205(HY000):锁定等待超时
超过;尝试重新启动事务
当发生锁定等待超时时 未执行当前语句。这个 当前事务未滚动 返回(直到MySQL 5.0.13 InnoDB 如果需要,回滚整个事务 发生锁等待超时


例如,当两个进程各自需要锁定被另一个进程锁定的行时,就会发生死锁,而再多的等待也无法解决冲突。

我设法重现并诊断了该问题。这是一个涉及MyISAM和InnoDB的死锁。它似乎是事务性InnoDB行锁定和关于事务性MyISAM表锁定。我提出了一个错误:。无论如何,我相信我最初的问题的答案是,InnoDB应该始终检测死锁,除非MySQL中存在错误。-

不幸的是,因为它没有检测到死锁,“最新检测到的死锁”中没有任何内容-(但我认为你是对的,我需要使用一些其他工具定期转储锁信息,希望我能捕获它。谢谢。我知道这可能发生,而不是死锁,我也不是100%确定这是死锁。我的系统中确实有长时间运行的进程,但我绞尽脑汁,确信没有一个进程我持有一个锁。这就是为什么我在寻找另一个选择,有一个死锁,但出于某种原因InnoDB没有检测到。但我会回去再次寻找一个长期持有的锁。谢谢你的想法。