Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/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
Magento MySQL数据库死锁_Mysql_Magento_Innodb_Deadlock_Mysql 5.1 - Fatal编程技术网

Magento MySQL数据库死锁

Magento MySQL数据库死锁,mysql,magento,innodb,deadlock,mysql-5.1,Mysql,Magento,Innodb,Deadlock,Mysql 5.1,我试图帮助客户机解决MySql DB死锁。这些死锁似乎导致API调用耗时10-30秒。我对API调用有重试逻辑,至少要尝试3次。然而,我的应用程序在3次API调用后仍然失败,大部分时间是由于死锁 我有一份“显示引擎innodb状态”的打印件。我改进了一些似乎困扰magento安装的magento查询。我仍然有这一个,似乎是弹出的状态,大部分时间。我清除了缓存,截断了日志表,删除了超过60天的销售报价 我要指出,这个MySql版本是5.1。我想告诉客户他们应该升级到5.5,这能解决大多数问题吗 关

我试图帮助客户机解决MySql DB死锁。这些死锁似乎导致API调用耗时10-30秒。我对API调用有重试逻辑,至少要尝试3次。然而,我的应用程序在3次API调用后仍然失败,大部分时间是由于死锁

我有一份“显示引擎innodb状态”的打印件。我改进了一些似乎困扰magento安装的magento查询。我仍然有这一个,似乎是弹出的状态,大部分时间。我清除了缓存,截断了日志表,删除了超过60天的销售报价

我要指出,这个MySql版本是5.1。我想告诉客户他们应该升级到5.5,这能解决大多数问题吗

关于这个死锁,我注意到锁没有意义。在我看来,第二笔交易不应该有这个索引的问题

这是Magento Enterprise 1.12.1

其他信息

显示创建表索引的过程

CREATE TABLE `index_process` (
 `process_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Process Id',
 `indexer_code` varchar(32) NOT NULL COMMENT 'Indexer Code',
 `status` varchar(15) NOT NULL DEFAULT 'pending' COMMENT 'Status',
 `started_at` timestamp NULL DEFAULT NULL COMMENT 'Started At',
 `ended_at` timestamp NULL DEFAULT NULL COMMENT 'Ended At',
 `mode` varchar(9) NOT NULL DEFAULT 'real_time' COMMENT 'Mode',
 PRIMARY KEY (`process_id`),
 UNIQUE KEY `UNQ_INDEX_PROCESS_INDEXER_CODE` (`indexer_code`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='Index Process'
显示创建表目录规则\产品\价格

CREATE TABLE `catalogrule_product_price` (
 `rule_product_price_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Rule Product PriceId',
 `rule_date` date NOT NULL DEFAULT '0000-00-00' COMMENT 'Rule Date',
 `customer_group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Customer Group Id',
 `product_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Product Id',
 `rule_price` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT 'Rule Price',
 `website_id` smallint(5) unsigned NOT NULL COMMENT 'Website Id',
 `latest_start_date` date DEFAULT NULL COMMENT 'Latest StartDate',
 `earliest_end_date` date DEFAULT NULL COMMENT 'Earliest EndDate',
 PRIMARY KEY (`rule_product_price_id`),
 UNIQUE KEY `UNQ_CATRULE_PRD_PRICE_RULE_DATE_WS_ID_CSTR_GROUP_ID_PRD_ID` (`rule_date`,`website_id`,`customer_group_id`,`product_id`),
 KEY `IDX_CATALOGRULE_PRODUCT_PRICE_CUSTOMER_GROUP_ID` (`customer_group_id`),
 KEY `IDX_CATALOGRULE_PRODUCT_PRICE_WEBSITE_ID` (`website_id`),
 KEY `IDX_CATALOGRULE_PRODUCT_PRICE_PRODUCT_ID` (`product_id`),
 CONSTRAINT `FK_CATALOGRULE_PRODUCT_PRICE_WEBSITE_ID_CORE_WEBSITE_WEBSITE_ID` FOREIGN KEY (`website_id`) REFERENCES `core_website` (`website_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `FK_CATRULE_PRD_PRICE_CSTR_GROUP_ID_CSTR_GROUP_CSTR_GROUP_ID` FOREIGN KEY (`customer_group_id`) REFERENCES `customer_group` (`customer_group_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `FK_CATRULE_PRD_PRICE_PRD_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`product_id`) REFERENCES `catalog_product_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1805881 DEFAULT CHARSET=utf8 COMMENT='CatalogRule Product Price'

不是查询,而是事务(!)冲突。事务2在
catalogrule\u product\u price
上持有共享锁。事务1尝试更新
catalogrule\u product\u price
,需要独占锁。这是锁。
由于您删除了日志中事务2的较低部分,因此我们无法看到更多详细信息以及最终导致死锁的原因。请提供完整的日志

顺便说一下,事务2运行的时间相当长。它已激活8秒,并锁定相同的时间。这不适合应用程序。您可能想阅读上的提示,它基本上是说应该通过更改查询执行来避免死锁

这里列出的另一个技巧是使用较低的隔离级别,提到了
readcommitted
,但我认为这在这里没有帮助(但您应该尝试一下!)

您应该仔细查看长时间运行的事务(以及相应的脚本)正在做什么。搜索此更新查询的代码

UPDATE `index_process` SET `status` = 'require_reindex' WHERE (process_id='9')
并分析相应脚本的作用

您的主要问题是,此脚本会长时间锁定行(产品价格行),这些行可能在应用程序中广泛使用。为了避免这种情况,您可以通过将事务隔离级别设置为
readuncommitted
,来避免它获得的共享锁,但要理解。该脚本可能会使用旧数据。如果你负担得起这个缺点,这可能会解决你的问题


更新MySQL很可能无法解决您的问题。死锁不取决于版本。(但是您可能希望进行更新,因为从5.1到5.5有一些重大的执行改进。例如关于优化器。)

这两个会话使用什么隔离级别?感谢您的回复。我不太明白你的意思。所以我搜索了隔离信息,找到了这个。因此,我运行了这个脚本“SELECT@@GLOBAL.tx_-isolation,@@tx_-isolation;”,这两个变量都返回了“REPEATABLE-READ”。感谢您提供的信息,您能否同时显示这两个表的结构?请使用客户端(phpadmin、mysqlworkbench等)登录数据库并运行命令:
SHOW CREATE TABLE index_process
SHOW CREATE TABLE catalogrule_product_price
,然后将这些命令的输出粘贴到问题。我猜这两个表之间存在外部约束,这是导致“奇怪”死锁的原因。我已经添加了请求的信息。似乎没有什么冲突。到目前为止,我的猜测是事务2显示更新查询,但这确实是真正的冲突。对不起,您的信息很有用。它不能帮助我解决手头的特定问题。我已经完成了你要求的大部分工作。然而,这不是我的申请。这是Magento,所以我正在寻找围绕Magento的帮助。希望有人能为同样的问题找到解决方案。我还没有深入研究代码。我已经修复了另一个常见的死锁。Magento只是充满了它们。
UPDATE `index_process` SET `status` = 'require_reindex' WHERE (process_id='9')