Ürün Fiyatının yeniden endekslenmesi işleminin çıkış işleminde kilitlenme istisnasına yol açtığına inandığım bir sorun yaşıyorum.
Ödeme sırasında bu istisnayı yakaladım:
Sipariş dönüştürme istisnası: SQLSTATE [40001]: Seri hale getirme hatası: 1213 Kilitlenmeye çalışırken kilitlenme bulundu; işlemi yeniden başlatmayı deneyin
Maalesef, istisnanın yakalandığı yer nedeniyle tam bir yığın izlemem yok, ancak INNODB durumunu kontrol ederek kilitlenme izini sürdüm:
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 istekte bulunan tablo kilidi, sonuçta Mage_CatalogInventory_Model_Stock::registerProductsSale()
, azaltmak için mevcut envanter sayımını almaya çalışırken ortaya çıkar.
Kilitlenme gerçekleştiği sırada, Product Price re-index işlemi devam ediyordu ve catalog_product_entity table
kilitlenmeye neden olan bir okuma kilidi olduğunu farz ediyorum . Kilitlenmeyi doğru anlıyorsam, herhangi bir okuma kilidi kilitlenmeye neden olur, ancak ürün fiyat endeksi, site ~ 50.000 ürüne sahip olduğundan, kilidi yeniden adil bir süre tutar.
Maalesef, ödeme kodu akışındaki bu noktada, müşterinin kredi kartından (özel bir ödeme modülü aracılığıyla) ödeme yapıldı ve ilgili sipariş nesnesinin yaratılması başarısız oldu.
Benim sorularım:
- Özel ödeme modülü mantığı arızalı mı? Örneğin, Magento'nun, ödemeyi ödeme yöntemine (kredi kartı) taahhüt etmeden önce teklifini ücretsiz bir sipariş istisnasına dönüştürmesini sağlamak için kabul edilmiş bir akış var mı?
Düzenleme: Görünüşe göre ödeme modülü mantığı gerçekten hatalı çünkü $ paymentmethod-> authorize (), bu kilitlenmenin gerçekleştiği yerin peşinde, daha önce değil (Ivan'ın cevabına göre) gerçekleşmelidir. Ancak, işlem hala kilitlenme tarafından engellenecek (kredi kartına hatalı ücret ödememekle birlikte).
Bu işlev çağrısı
$stockInfo = $this->_getResource()->getProductsStock($this, array_keys($qtys), true);
içindeMage_CatalogInventory_Model_Stock::registerProductsSale()
bir kilitleme okuma, ne kadar tehlikeli olurdu markaların olmayan bir kilitleme okuma yapmak için?Bir cevap için web'de arama yaparken, site sıcakken tam bir yeniden indeksleme yapmamayı öneren birkaç yer önerildi; pek iyi bir çözüm gibi görünmüyor; Tablo kilitlenme ve kilit çekişmelerine neden olan endeksleme sorunu Magento'da bilinen bir sorun mu?
Düzenleme: Burada kalan soru üçüncü sorudan biri gibi görünüyor; Tablo kilitlenmelerine neden olan yeniden indeksleme. Bunun için geçici çözümler arıyorsunuz.
Düzenleme: Kilitlenmelerin kendi başlarına değil, başlı başına bir mesele olmadığı, bunlara verilen yanıtın odak noktası olması gerektiği çok mantıklı olmalıdır. Kilitlenme istisnasını yakalamak ve isteği yeniden yayınlamak için kodda bir nokta bulmak için daha fazla araştırma yapmak. Bunu Zend Framework DB bağdaştırıcısı düzeyinde yapmak bir yaklaşımdır, ancak aynı zamanda bunu sürdürmek için Magento kodunda da yapmanın bir yolunu arıyorum.
Bu konuda ilginç bir yama var: http://www.magentocommerce.com/boards/viewthread/31666/P0/ ilgili bir kilitlenme durumunu çözüyor gibi görünüyor (ama bunu özellikle değil).
Düzenleme: Görünüşe göre kilitlenme CE 1.8 Alpha bir dereceye kadar ele alınmıştır. Bu sürüm Alpha dışında olana kadar hala bir geçici çözüm arıyor