У мене виникає проблема, за якою я вважаю, що процес повторної індексації цін на продукцію спричиняє тупиковий виняток у процесі оформлення замовлення.
Цей виняток я зловив у процесі оформлення замовлення:
Виняток конверсії для замовлення: SQLSTATE [40001]: Помилка серіалізації: 1213 виявлено тупиковий сигнал при спробі заблокувати замовлення; спробуйте перезапустити транзакцію
На жаль, у мене немає повного сліду стека через те, де було вилучено виняток, але перевіривши стан INNODB, я зміг відстежити тупик:
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(47447, 56678)) FOR UPDATE
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 329624 n bits 352 index
`PRIMARY` of table `xxxx`.`catalog_product_entity`
Блокування таблиці запитів SQL в кінцевому рахунку генерується з Mage_CatalogInventory_Model_Stock::registerProductsSale()
того моменту, коли він намагається отримати поточну кількість запасів, щоб зменшити його.
На момент виникнення тупикової ситуації процес повторного індексування ціни на продукт запускався, і я припускаю, що в ньому було заблоковано читання, catalog_product_entity table
яке спричинило тупик. Якщо я правильно розумію тупик, будь-який блокування читання спричинить тупик, але повторний індекс цін на продукт утримує блокування протягом досить тривалого часу, оскільки на сайті розміщено ~ 50 000 продуктів.
На жаль, до цього моменту в потоці коду оформлення каси було стягнуто кредитну карту клієнта (через спеціальний модуль оплати), і створення відповідного об’єкта замовлення не вдалося.
Мої запитання:
- Чи несправна логіка модуля оплати користувача? тобто чи є прийнятий потік для забезпечення того, що Magento може перетворити котирування у виняток із замовлення безкоштовно, перш ніж здійснити плату за спосіб оплати (кредитна картка)?
Редагувати: Схоже, логіка модуля оплати дійсно несправна, оскільки виклик $ Paymentmethod-> autize () повинен відбуватися після того місця, де відбувається цей тупик, а не раніше (відповідно до відповіді Івана нижче). Однак транзакція все-таки буде заблокована тупиком (хоча і не вимагає стягнення з кредитної картки).
Виклик цієї функції
$stockInfo = $this->_getResource()->getProductsStock($this, array_keys($qtys), true);
вMage_CatalogInventory_Model_Stock::registerProductsSale()
робить його блокування читання, наскільки небезпечно було б зробити це без блокування читання?У пошуках відповіді в Інтернеті кілька місць запропонували не проводити повну переіндексацію, поки сайт гарячий; навряд чи здається хорошим рішенням; це питання індексації, що спричиняє тупіки таблиці та суперечки щодо блокування, відома проблема в Magento, чи існують обхідні шляхи?
Редагувати: Здається, питання, що залишилося тут, - це питання третього; повторна індексація, що спричиняє тупикові таблиці. Шукаєте обхідні шляхи для цього.
Редагувати: Концепція того, що тупики не є самими проблемами, а скоріше, саме у відповіді на них має бути фокус, має багато сенсу. Далі досліджуємо, щоб знайти крапку в коді, щоб зафіксувати виняток із тупикової ситуації та повторно подати запит. Робити це на рівні адаптера DB Zend Framework - це один підхід, але я також шукаю спосіб зробити це в коді Magento для полегшення ремонту.
У цій темі є цікавий виправлення: http://www.magentocommerce.com/boards/viewthread/31666/P0/, який, здається, вирішує пов'язану з цим ситуацію (але не конкретно).
Редагувати: Очевидно, тупик був вирішений на ступінь CE 1.8 Alpha. Досі шукаю вирішення, поки ця версія не вийде з Альфи