我正在使用Magento1.7.0.2社区版,我遇到了一个大问题-死锁和“锁定等待超时超过”错误。执行特定CRON任务时存在问题
那么,我的问题是--有没有办法避免这种情况(无论是在PHP、MySQL还是服务器(我们使用nginx)级别)?
发布于 2012-11-12 20:39:00
当我一次进口五到六个以上的产品时,我发现了这个问题。有更多关于可用死锁的这里信息。
为了解决这个问题,我必须尽可能地将数据库查询放在斯莱尔事务中,如下所示:
$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交易示例:
$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;
}如果您在这方面需要进一步的帮助,请随时通知我。
发布于 2013-05-24 15:09:22
我们也遇到了一个类似的问题:当顾客试图在他们的购物车中添加一些东西时,每天都会出现几次死锁。我们的索引似乎也与当时正在刷新的索引有关(很可能是目录表的重新索引)。最后解决问题的唯一方法是实现异步重新索引(我们最终购买了一个扩展)。
发布于 2013-10-09 07:07:57
我们也遇到了这个问题,试图并行地保存产品。
我们面临的主要问题是,在最初保存产品之后,随后的索引过程没有包含在产品保存事务中。因此,每当我们遇到死锁时,它都是由索引器引起的,而在它的顶部,我们有一个不一致的数据库,这会导致无效的产品-urls,并迫使我们在每次发生时都重新索引所有的东西。
我们最终得到的解决方案是将索引器包含到事务中,并重新尝试最终导致死锁的事务。然而,这并不是一个理想的解决方案,它是我们所能想到的最好的解决方案,而且在99%的时间里有效。
magento的问题在于,编程是粗制滥造的,事件驱动的瑞士军刀编码方法在magento的内部机制中产生了许多深刻的问题。
我们的下一个方法将是我们自己的接口,从头开始编写,将产品并行保存,并使数据库具有与magento保存相同的结果。当然,这将意味着我们不能再添加扩展而不将它们集成到这个新概念中,以防它们与产品相关。
https://stackoverflow.com/questions/13309341
复制相似问题