問題的高層次摘要:發出訂單時鎖定庫存表的問題導致由於超時導致訂單失敗。在Magento庫存數量更新過程中使用「FOR UPDATE」
在結帳過程跟蹤,我看到正在執行以下查詢:(意見由我添加)
-- Lock stock and product tables
SELECT `si`.*, `p`.`type_id` FROM `cataloginventory_stock_item` AS `si`
INNER JOIN `catalog_product_entity` AS `p` ON p.entity_id=si.product_id
WHERE (stock_id=1) AND (product_id IN(28775, 28777)) FOR UPDATE
-- Perform the actual stock update
UPDATE `cataloginventory_stock_item`
SET `qty` =
CASE product_id
WHEN 28775 THEN qty-2
WHEN 28777 THEN qty-1
ELSE
qty
END
WHERE (product_id IN (28775, 28777)) AND (stock_id = 1)
我的FOR UPDATE
修改一個SELECT
語句的理解是,在表中的所有行被返回在SELECT
將被鎖定(讀寫)?直到事務提交。
從我對MySQL的理解來看,cataloginventory_stock_item
查詢具有qty
列的計算值(即該值未在PHP中計算並傳遞到查詢中,新列值基於現有列查詢執行時的值)意味着它不會受到競爭條件的影響。
我的問題是:
- 是我的假設是否正確?
- 爲什麼Magento需要鎖定
catalog_product_entity
才能更新庫存? - 爲什麼Magento需要鎖定
cataloginventory_stock_item
如果cataloginventory_stock_item
UPDATE
是原子?
我正面臨同樣的問題。你有沒有發現這種情況下的一些原因? –