2013-12-18 10 views
6

Moja strona internetowa ma problemy z płatnością. Używam Magento Enterprise 1.8, a mój moduł kasowy to Onestepcheckout Idev.Magento 1.8: Zablokuj limity czasu oczekiwania, gdy klient jest sprawdzany

Problem, który widzimy, polega na tym, że tabela eav_entity_store zajmuje bardzo długi czas (do 51 sekund), aby zwrócić numer zamówienia do Mage_Eav_Model_Entity_Type.

Wiem, że uruchomienie kwerendy w celu uzyskania tej operacji jest uruchamiane jako "DO AKTUALIZACJI", więc dostęp do wiersza jest zablokowany do momentu zakończenia transakcji. Sprawdziłem inne części kodu, a także kod PHP w trakcie transakcji, w której wiersz jest zablokowany (używamy InnoDB, więc blokada powinna zostać zwolniona po zatwierdzeniu transakcji) i po prostu nie widzę cokolwiek tam (lub w dziennikach powolnych zapytań), które powinny powodować blokadę oczekiwania w pobliżu 51 sekund.

Rozważałem, że żądania mogą być zbierane i powoli skracać czas oczekiwania, ale widzę, że czas zapytania wynosi od 6ms do 20kms do 50k ms 1,2,3. Nie jest to kwestia 100-200 wniosków złożonych, ponieważ jest ich tylko kilkadziesiąt dziennie.

Jestem świadomy, że MySql używa blokady rodzicielskiej, ale nie ma żadnych FK związanych z tą tabelą. Istnieją dwa indeksy BTREE, które w pewnym momencie były FK, ale od tego czasu zostały zmienione (co miało miejsce wiele lat temu). Dla tych, którzy są nie-Magento savy, tabela eav_entity_store ma mniej niż 50 wierszy i ma tylko 5 kolumn szerokości (4 smallint i varchar). Poważnie wątpię w tabelkę lub niewłaściwe indeksowanie jest sprawcą. W duchu TLDR powiem jednak, że dwa indeksy BTREE to dwie kolumny, które wybieramy z tej tabeli.

Jedną z możliwości jest to, że może być konieczne zastąpienie dwóch indeksów indeksem złożonym, ponieważ TYLKO odczytuje tę tabelę z zapytania, które czyta (Z [kolumna z indeksem A] I [kolumna z indeksem B]). Po prostu nie wiem, czy blokowanie na poziomie wiersza uniemożliwiłoby temu zapytaniu uzyskanie dostępu do innego wiersza w tabeli z indeksami aktualnie znajdującymi się w tabeli.

W tym momencie przekonałem się, że podstawowa kwestia jest ściśle związana z DB, ale wszelkie porady Magento lub MySql w tej sprawie byłyby bardzo mile widziane. Ktoś, kto wciąż czyta to, może miejmy nadzieję, że doceniłem już kilka opcji i jestem tu poważnie zaskoczony. Wszelkie informacje, które Twoim zdaniem mogą pomóc, są mile widziane. Dzięki.

Edit Dokładny błąd widzimy to: wiadomość o błędzie: SQLSTATE [HY000]: Błąd ogólny: 1205 Blokada limit czasu oczekiwania przekroczone; spróbuj ponownie uruchomić transakcję

+0

Czy można odtworzyć po uruchomieniu powolnego zapytania ręcznie? W takim przypadku możesz go profilować. –

+0

Niestety nie mogłem się rozmnażać. DB hosting odbywa się zdalnie. Czekałem na wiadomość od DBA, aby zobaczyć, jakie informacje mogą dać. Zaktualizuję tutaj, gdy już to zrobią. –

+0

ten sam problem na Magento 1.8 ... może to jest problem po stronie UPS, a nie magento? – WonderLand

Odpowiedz

0

Problem rozwiązany. Nie było problemu z MySql. Z jakiegoś powodu generowanie numerów faktur zajmowało nieprzyzwoicie długi czas. Firma nie wykorzystuje faktur z Magento. Wyłączyłem je. Problem rozwiązany. Nie wykonano pełnego RCA w odniesieniu do konkretnie problemu z generowaniem faktur.

+0

Używam Magento Community 1.8.0, a mój moduł kasowania to Onestepcheckout Idev. Wobec tego samego problemu, czy możesz wskazać mi dokładnie, gdzie mam sprawdzić lub wyłączyć formularz faktury? –

+1

Prawdopodobnie nie jest to najlepszy sposób na naprawę, ale zrobiliśmy to w ten sposób, ponieważ zrzucaliśmy naszą obecną instalację do nowej kopii magento. Będę się troszczyć, zanim pójdziesz tą drogą.W Mage_Eav_Model_Entity_Type :: fetchNewIncrementId, w linii 150 (moje wiersze są nieco inne, ponieważ plik został zmodyfikowany) po linii $ type = $ this-> getEntityTypeCode(); dodaj coś w stylu if ($ type === 'invoice') zwróć 'INV0' Nie jest to jedyny sposób, aby naprawić cokolwiek, ale dostaję kasę ponownie. –

+0

Dzięki Danny, za pomoc –

Powiązane problemy