मैं एक समस्या का सामना कर रहा हूं, जहां मेरा मानना है कि उत्पाद मूल्य पुन: अनुक्रमण प्रक्रिया चेकआउट प्रक्रिया में एक गतिरोध अपवाद का कारण बन रही है।
मैंने चेकआउट प्रक्रिया में इस अपवाद को पकड़ा:
आदेश रूपांतरण अपवाद: 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 एक ऑर्डर अपवाद को उद्धरण मुक्त कर सकता है?
संपादित करें: ऐसा प्रतीत होता है कि भुगतान मॉड्यूल तर्क वास्तव में दोषपूर्ण है क्योंकि $ paymethod-> को प्राधिकृत करना () उस स्थान के बाद होना चाहिए जहां यह गतिरोध होता है, इससे पहले नहीं (नीचे के इवान के जवाब के अनुसार)। हालाँकि, लेन-देन अभी भी गतिरोध (क्रेडिट कार्ड के लिए गलत शुल्क के बिना) द्वारा अवरुद्ध किया जाएगा।
इस समारोह कॉल
$stockInfo = $this->_getResource()->getProductsStock($this, array_keys($qtys), true);
मेंMage_CatalogInventory_Model_Stock::registerProductsSale()
बनाता है यह एक ताला पढ़ने, कितना खतरनाक हो सकता है यह एक गैर ताला लगा पढ़ने बनाने के लिए?एक उत्तर के लिए वेब पर खोज करने के लिए कुछ स्थानों पर सुझाव दिया गया है कि साइट के गर्म होने पर पूर्ण पुन: अनुक्रमण नहीं किया जाएगा; शायद ही एक अच्छा समाधान की तरह लगता है; क्या मैगेंटो में टेबल डेडलॉक और लॉक कॉन्टैक्शन को एक ज्ञात मुद्दा बनाने के लिए इंडेक्सिंग का मुद्दा है, क्या वर्कअराउंड हैं?
संपादित करें: ऐसा लगता है कि शेष प्रश्न यहां तीसरे प्रश्न से एक है; तालिका गतिरोध के कारण पुन: अनुक्रमण। इसके लिए वर्कअराउंड की तलाश कर रहे हैं।
संपादित करें: गतिरोध जो अवधारणा स्वयं के मुद्दों में नहीं है, बल्कि उन पर प्रतिक्रिया फोकस होना चाहिए, बहुत समझ में आता है। गतिरोध अपवाद को पकड़ने के लिए कोड में एक बिंदु खोजने और अनुरोध को फिर से जारी करने के लिए आगे की जांच। ज़ेंड फ्रेमवर्क डीबी एडेप्टर स्तर पर ऐसा करना एक दृष्टिकोण है, लेकिन रखरखाव को आसान बनाने के लिए मैगेंटो कोड में ऐसा करने का एक तरीका भी ढूंढ रहा है।
इस धागे में एक दिलचस्प पैच है: http://www.magentocommerce.com/boards/viewthread/31666/P0/ जो संबंधित गतिरोध की स्थिति को हल करने के लिए लगता है (लेकिन यह विशेष रूप से नहीं)।
संपादित करें: जाहिरा तौर पर गतिरोध को सीई 1.8 अल्फा में एक डिग्री तक संबोधित किया गया है। अभी भी वर्कअराउंड की तलाश है जब तक कि यह संस्करण अल्फा से बाहर न हो