死锁一个真实世界的例子:
两个机械师正在在修理过程中的某一时刻,他们都需要一把螺丝刀和一把锤子来松开一些严重卡住的零件。机械师A抓起螺丝刀,机械师B抓起锤子,现在都不能继续,因为他们需要的第二种工具不可用:它们被锁定
现在,人类很聪明,其中一个机制会很亲切,并将他们的工具交给另一个:两者都可以继续工作。愚蠢的,并且这两个查询都不会很亲切,并且可以解开造成死锁的任何资源。此时,DBMS将转变Rambo并强制回滚(或仅仅杀死)一个或多个相互锁定的查询。这将让一个幸运查询继续并继续获取它所需的锁定/事务,并希望被中止的应用程序具有足够智能的应用程序来处理它们,这将稍后再次重新启动事务。在较旧/较简单的DBMS上,整个系统将停止运行,直到DBA进入并进行一些手动清理。
有很多方法可以应对死锁,并首先避免它们。一个重要的问题是永远不要将资源锁定在“随机”订单中。在我们的机械的情况下,在到达锤子之前,都应该首先到达螺丝刀。这样一个人可以立即成功工作,而另一个人会知道他必须等待。至于混合InnodB/MyISAM - MySQL完全支持在查询中混合/匹配表类型。你可以按你想要的顺序选择/ join/update/insert/delete/alter,只要记住在InnoDB事务中对MyISAM表进行任何操作都不会使MyISAM神奇地处理事务。 MyISAM部分将立即执行/提交,如果你回滚InnoDB这一方,MyISAM也不会回滚。
现在坚持使用MyISAM的唯一主要原因是它支持全文索引。除此之外,InnoDB通常会是更好的选择,因为它具有完整的事务支持和行级锁定。
如果您不需要MyISAM特定功能,如全文检索或快速全表COUNT(*),那么从MyISAM移动到InnoDB应该没有任何问题。 MyISAM不会比InnoDB更快,InnoDB也不会比MyISAM更快。一个表现更好,另一个表现更好。我实际上切换到了InnoDB,因为它在具有许多写操作的表上更具性能,因为它使用行级锁而不是MyISAM的表级锁。所以,如果你不需要任何MyISAM特有的功能,不要害怕切换;) – NikiC 2010-10-18 11:29:18
那我怎么能在InnoDB中遇到这样的僵局呢?我之前使用过此引擎,但从未使用过大型数据库。现在我正在使用许多DB(超过40个)的应用程序工作,每个DB都是10-20MB。它并不多,但仍然有很多数据。 – 2010-10-18 11:48:30