如何解决InnoDB引擎中的死锁问题?

时间:2010-10-18 11:23:47

标签: php mysql innodb deadlock

我听说过这个问题,现在我正在寻找更具体的信息?

它是如何发生的,原因是什么,详细解释了试图避免它的死锁机制。如何检测死锁,解决它并保护数据不被破坏。这种情况是使用MySQL和PHP。

我可以混合使用InnoDB和MyISAM吗?我打算将innoDB用于一些具有许多关系的majo rtables而不是那么多数据,如用户,角色,特权,公司等,并将MyISAM用于包含更多数据的表:客户数据,操作数据等。我想仅使用InnoDB,但从速度和稳定性方面来看,MyISAM的举动让我感到有些害怕。现在这个僵局:(

1 个答案:

答案 0 :(得分:2)

如果您有两个或更多独立查询同时访问相同资源(表/行),则可能会发生死锁。一个现实世界的例子:

两位技师正在开两辆车。在维修期间的某些时候,他们都需要一把螺丝刀和一把锤子来松开一些严重卡住的零件。机械师A抓住螺丝刀,机械师B抓住锤子,现在两者都不能继续,因为他们需要的第二个工具不可用:它们已陷入僵局。

现在,人类很聪明,其中一个机制将是仁慈的,并将他们的工具交给另一个:两者都可以继续工作。数据库有点愚蠢,任何查询都不会很优雅并解锁导致死锁的任何资源。此时,DBMS将转动Rambo并强制回滚(或者只是杀死)一个或多个相互锁定的查询。这将让一个幸运的查询继续并继续获得它所需的锁定/事务,并且希望被中止的查询具有足够聪明的应用程序来处理它们,这将在以后再次重新启动事务。在较旧/较简单的DBMS上,整个系统都会停止运行,直到DBA进入并进行一些手动清理。

有很多方法可以应对死锁,并首先避免它们。一个重要的是永远不会锁定“随机”订单中的资源。在我们的机械师的情况下,两者都应该先拿到螺丝刀,然后才能拿到锤子。这样一个人可以立即成功地工作,而另一个人知道他必须等待。

至于混合InnodB / MyISAM - MySQL完全支持在查询中混合/匹配表类型。您可以按任何顺序选择/加入/更新/插入/删除/更改,只需记住在InnoDB事务中对MyISAM表执行任何操作都不会使MyISAM神奇地识别事务。 MyISAM部分将立即执行/提交,如果您回滚InnoDB方面,MyISAM也不会回滚。

如今坚持使用MyISAM的唯一主要原因是它支持全文索引。除此之外,InnoDB通常是更好的选择,因为它具有完整的事务支持和行级锁定。