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

标签 php mysql innodb deadlock

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

怎么会发生,是什么原因,详细解释死锁的机制,尽量避免死锁。如何检测死锁、解决它并保护数据不因此而损坏。这种情况是将 MySQL 与 PHP 一起使用时。

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

最佳答案

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

两个机械师正在修理两辆车。在维修过程中的某个时候,他们都需要一把 Screwdriver 和一把锤子来松开一些严重卡住的部件。机械师 A 拿着 Screwdriver ,机械师 B 拿着锤子,现在他们都无法继续,因为他们需要的第二个工具不可用:他们陷入了僵局。

现在,人类很聪明,其中一位机械师会很亲切地把他们的工具交给另一位:两人都可以继续工作。数据库有些愚蠢,而且这两个查询都不会很好地解锁导致死锁的任何资源。此时,DBMS 将转向 Rambo 并强制回滚(或干脆终止)一个或多个相互锁定的查询。这将使一个幸运的查询继续并继续获取它需要的锁/事务,并希望中止的查询有足够智能的应用程序处理它们,稍后将再次重新启动事务。在较旧/较简单的 DBMS 上,整个系统会逐渐停止,直到 DBA 介入并进行一些手动清理。

有很多方法可以处理死锁,并首先避免死锁。一个重要的是永远不要以“随机”顺序锁定资源。在我们的机械师的例子中,两人都应该先拿到 Screwdriver ,然后再拿到锤子。这样一个人可以立即成功地工作,而另一个人会知道他必须等待。

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

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

关于php - 如何解决InnoDB引擎中的死锁问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3958606/

相关文章:

php - Symfony2 - Doctrine-extension - 用户可登录

mysql - 尝试解决MySQL选择查询中的日期条件

phpqrcode 库以字符串形式返回图像

php - 将经验值添加到数据库 php

mysql - 在 MySQL 中存储多语言地理数据

mysql - InnoDB 的 LOAD INDEX INTO CACHE 替代品? MySQL

MySQL 键约束

php - 大型数据集 : mysql_unbuffered_query with innodb?

javascript - 使用 Javascript 和 php 启用按钮

php - 库中的 Composer.lock