我有一个很少扩展的magento网站。主要扩展名是唯一代码的礼品卡扩展。我们现在正在使用800K代码进行促销,因此它正在创造巨大的流量。问题是现在它是在付款后创建鬼订单 - 在订单必须从保留订单注册到确认的最后时刻 - 它显示表锁定错误。
确切错误是:
SQLSTATE [HY000]:一般错误:1205超过锁定等待超时;尝试重新启动事务,查询为:INSERT INTO
sales_flat_order_grid
(entity_id
,status
,store_id
,customer_id
,base_grand_total
,base_total_paid
,grand_total
,total_paid
,increment_id
,base_currency_code
,order_currency_code
,store_name
,created_at
,updated_at
,{ {1}},billing_name
)SELECTshipping_name
。main_table
,entity_id
。main_table
,status
。main_table
,{{ 1}}。store_id
,main_table
。customer_id
,main_table
。base_grand_total
,main_table
。base_total_paid
,{{1} }。main_table
,grand_total
。main_table
,total_paid
。main_table
,increment_id
。main_table
,base_currency_code
。main_table
,order_currency_code
。main_table
,store_name
。main_table
,CONCAT(IFNULL(table_billing_name.firstname,''),&# 39;',IFNULL(table_billing_name.middlename,''),'',IFNULL(table_billing_name.lastname,''))AS { {1}},CONCAT(IFNULL(table_shipping_name.firstname,''),'',IFNULL(table_shipping_name.middlename,''),&# 39;',IFNULL(table_shipping_name.lastname,''))AScreated_at
FROMmain_table
ASupdated_at
LEFT JOINbilling_name
AS { {1}}shipping_name
。sales_flat_order
=main_table
。sales_flat_order_address
LEFT JOINtable_billing_name
ASmain_table
ONbilling_address_id
。{{ 1}} =table_billing_name
。entity_id
WHERE(main_table.entity_id IN(' 140650'))ON DUPLICATE KEY UPDATEsales_flat_order_address
= VALUES(table_shipping_name
) ,main_table
= VALUES(shipping_address_id
),table_shipping_name
= V. ALUES(entity_id
),entity_id
= VALUES(entity_id
),status
= VALUES(status
),store_id
= VALUES({{1 }}),store_id
= VALUES(customer_id
),customer_id
= VALUES(base_grand_total
),base_grand_total
= VALUES(base_total_paid
),{ {1}} = VALUES(base_total_paid
),grand_total
= VALUES(grand_total
),total_paid
= VALUES(total_paid
),increment_id
= VALUES(increment_id
),base_currency_code
= VALUES(base_currency_code
),order_currency_code
= VALUES(order_currency_code
),store_name
= VALUES({{1 }})
似乎没有引用,除了:140650 for sales_flat_order_grid的实体ID。
如果有任何人有任何想法,请告诉我可能的解决方案。
答案 0 :(得分:2)
此问题可能与早期版本的Magento中的错误有关。过去,在事务中发生了对sales_flat_order_grid的INSERT。并且由于Magento用来填充它的查询,查询计划程序无法确定要锁定它的行锁定了整个sales_flat_order_grid表。因为在事务中发生了这种情况,锁定一直保留到COMMIT。
如果这是导致问题的原因,则需要解决将订单网格计算移至commit_after的问题。
答案 1 :(得分:0)
好的,我正在回答我自己的问题 - 万一其他人觉得有帮助。
解决方案:从import ClassImade
var1 = ClassImade()
Var2 = ClassImade()
运行对遗失entity_id
的插入查询,通过将sales_flat_order
替换为140650
来运行以上查询,这将解决此问题。这是因为两个表共享相同的main_table.entity_id NOT IN (select sales_flat_order.entity_id from sales_flat_order)
值。
我也知道请设置慢查询日志,因为你可以看到哪个查询花了很长时间(它们是创建死锁的那个,因为db服务器资源被占用) - 很快我发现这样并解决了第三方扩展慢查询问题 - 没有表锁错误。