আমি এমন একটি সমস্যার মুখোমুখি হয়েছি যেখানে আমি বিশ্বাস করি যে পণ্যের মূল্য পুনরায় সূচি প্রক্রিয়া চেকআউট প্রক্রিয়াটিতে একটি অচলাবস্থা ব্যতিক্রম ঘটায়।
আমি চেকআউট প্রক্রিয়াতে এই ব্যতিক্রমটি ধরলাম:
অর্ডার রূপান্তর ব্যতিক্রম: এসকিউএলস্টেট [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`
এসকিউএল অনুরোধের টেবিল লকটি চূড়ান্তভাবে তৈরি করা হয় Mage_CatalogInventory_Model_Stock::registerProductsSale()
যখন এটি হ্রাস করার জন্য বর্তমান ইনভেন্টরি গণনা পাওয়ার চেষ্টা করছে।
অচলাবস্থার সময়, পণ্যের মূল্য পুনরায় সূচী প্রক্রিয়া চলছিল এবং আমি ধরে নিচ্ছি যে এটিতে একটি রিড লক রয়েছে catalog_product_entity table
যার ফলে অচলাবস্থার সৃষ্টি হয়েছিল। আমি যদি অচলতটি সঠিকভাবে বুঝতে পারি তবে যে কোনও পঠিত লক একটি অচলাবস্থার কারণ হয়ে উঠবে, তবে পণ্যের মূল্য পুনরায় সূচীটি তালিকার জন্য উপযুক্ত সময়ের জন্য লকটি ধরে রাখে কারণ সাইটের ~ 50,000 পণ্য রয়েছে।
দুর্ভাগ্যক্রমে, চেকআউট কোড প্রবাহের এই সময়ে গ্রাহকের ক্রেডিট কার্ড চার্জ করা হয়েছিল (কাস্টম পেমেন্ট মডিউলটির মাধ্যমে), এবং সম্পর্কিত অর্ডার অবজেক্ট তৈরি করা ব্যর্থ হয়েছিল।
আমার প্রশ্নগুলি হ'ল:
- কাস্টম পেমেন্ট মডিউল লজিক ত্রুটিযুক্ত? অর্থাত্ পেমেন্ট পদ্ধতিতে (ক্রেডিট কার্ড) চার্জ দেওয়ার আগে ম্যাজেন্টো উক্ত উদ্ধৃতিটিকে একটি অর্ডার ব্যয়ে ফ্রি রূপান্তর করতে পারে তা নিশ্চিত করার জন্য কি কোনও গ্রহণযোগ্য প্রবাহ রয়েছে?
সম্পাদনা: এটি প্রদর্শিত হচ্ছে পেমেন্ট মডিউল যুক্তিটি সত্যই ত্রুটিযুক্ত কারণ dead পেমেন্টমেডোথড>> অনুমোদন () এ কল করার পরে যেখানে এই অচলাবস্থা ঘটেছিল তার আগে ঘটবে, আগে নয় (ইভানের উত্তর অনুসারে)। তবে লেনদেনটি এখনও অচলাবস্থার দ্বারা অবরুদ্ধ থাকবে (ক্রেডিট কার্ডের ত্রুটিযুক্ত চার্জ ব্যতীত)।
এই ফাংশনটি কল
$stockInfo = $this->_getResource()->getProductsStock($this, array_keys($qtys), true);
মধ্যেMage_CatalogInventory_Model_Stock::registerProductsSale()
তোলে এটি একটি লকিং পঠিত, কতটা বিপজ্জনক এটি হবে এটি একটি অ-লক পঠিত করতে?উত্তরের জন্য ওয়েব অনুসন্ধান করতে গিয়ে বেশ কয়েকটি জায়গার পরামর্শ দেওয়া হয়েছিল যে সাইটটি গরম থাকাকালীন সম্পূর্ণ পুনরায় সূচীকরণ না চালাবে; একটি ভাল সমাধান খুব কমই মনে হয়; টেস্টের অচলাবস্থা এবং লক বিতর্ককে ইন্ডেক্স করার বিষয়টি কি ম্যাজেন্টোতে একটি জ্ঞাত সমস্যা, সেখানে কি কর্মক্ষেত্র রয়েছে?
সম্পাদনা: মনে হচ্ছে এখানে অবশিষ্ট প্রশ্নটি তৃতীয় প্রশ্ন থেকে এক; পুনরায় সূচীকরণের ফলে টেবিলের অচলাবস্থা রয়েছে। এর জন্য কাজের সন্ধান করছি।
সম্পাদনা করুন: যে ধারণাটি অচলাবস্থাগুলি অন্তর্ভুক্ত নয় এবং সেগুলি নিজেরাই ইস্যু করে না, বরং তাদের প্রতিক্রিয়াটি ফোকাস হওয়া উচিত, তা অনেকটা বোঝায়। অচলাবস্থা ব্যতিক্রম ধরা এবং অনুরোধটি পুনরায় প্রকাশ করার জন্য কোডের একটি বিন্দু খুঁজে পেতে আরও তদন্ত করা হচ্ছে। জেন্ড ফ্রেমওয়ার্ক ডিবি অ্যাডাপ্টারের স্তরে এটি করা একটি পদ্ধতির, তবে রক্ষণাবেক্ষণযোগ্যতা স্বাচ্ছন্দ্যের জন্য ম্যাজেন্টো কোডে এটি করার একটি উপায়ও খুঁজছি।
এই থ্রেডে একটি আকর্ষণীয় প্যাচ রয়েছে: http://www.magentocommerce.com/boards/viewthread/31666/P0/ যা সম্পর্কিত অচলাবস্থার শর্তটি সমাধান করে বলে মনে হচ্ছে (তবে এটি বিশেষত এটি নয়)।
সম্পাদনা করুন: স্পষ্টতই ডেডলকিং সিই 1.8 সালে একটি ডিগ্রীতে সম্বোধন করা হয়েছে আলফা। এই সংস্করণটি আলফা থেকে বের না হওয়া অবধি এখনও একপর্যায়ে খুঁজছেন