Magento陷入僵局

wer*_*erd 9 magento database-deadlocks

我正在使用Magento 1.7.0.2社区版,我遇到了一个大问题 - 死锁和"锁定等待超时超时"错误.执行特定CRON任务时 存在问题

  • 导入/更新产品(尺寸,颜色,制造商).大约有5000个产品,但在90%的脚本中会出现"超出锁定等待超时"错误或死锁错误.脚本是使用Magento指南开发的,如果没有其他进程正在运行,它可以正常工作.例如,如果reindex正在运行,我们肯定会收到错误.由于表锁而导致接缝
  • 在某些情况下,Magento会设置读锁定功能.我已经阅读了几个关于这个的主题,并且唯一合适的解决方案是改变/lib/Zend/Db/Statement/Pdo.php _execute函数.由于我们期待将Magento升级到最新的稳定版本,我们无法承受不断变化的核心文件.

所以我的问题 - 有没有办法如何避免这种情况(无论是在PHP,MySQL还是服务器(我们使用nginx)级别)?

jam*_*mes 9

我在试图同时导入超过五六种产品时遇到了这个问题.有关死锁的更多信息,请点击此处.

要解决这个问题,我必须尽可能将数据库查询放在SERIALIZABLE事务中,如下所示:

$adapter = Mage::getModel('core/resource')->getConnection('core_write');
// Commit any existing transactions (use with caution!)
if ($adapter->getTransactionLevel > 0) {
    $adapter->commit();
}
$adapter->query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$product->save(); // etc
Run Code Online (Sandbox Code Playgroud)

交易示例:

$adapter = Mage::getModel('core/resource')->getConnection('core_write');
// Commit any existing transactions (use with caution!)
if ($adapter->getTransactionLevel > 0) {
    $adapter->commit();
}
$adapter->query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$adapter->beginTransaction();
try {
    $adapter->query(/* SQL goes here */);
    $adapter->commit();
} catch (Exception $e) {
    // Rollback on fail always
    $adapter->rollBack();
    throw $e;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要任何进一步的帮助,请随时告诉我.

  • 凹凸.这是一个令人惊叹的*修复.它听起来很简单 - 获取适配器并在保存之前设置隔离级别.这为我的团队解决了一年的头痛问题!+1 (2认同)