Ich benutze Magento 1.7.0.2 Community Edition und ich habe ein großes Problem festgestellt - Deadlocks und "Lock wait timeout exceeded" -Fehler. Problem existiert, während bestimmte CRON Aufgaben ausgeführt werden
Also meine Frage - gibt es eine Möglichkeit, dies zu vermeiden (ob auf PHP, MySQL oder Server (wir benutzen nginx) Ebene)?
Ich stieß auf dieses Problem, als ich versuchte, mehr als fünf oder sechs Produkte gleichzeitig zu importieren. Es gibt weitere Informationen zu Deadlocks verfügbar hier .
Um dieses Problem zu lösen, musste ich meine Datenbankabfragen in SERIALIZABLE Transaktionen wo möglich, so:
%Vor%Transaktionsbeispiel:
%Vor%Wenn Sie weitere Hilfe benötigen, können Sie mich gerne darüber informieren.
Wir hatten ein ähnliches Problem mit Deadlocks, die einige Male am Tag auftauchten, als Kunden versuchten, etwas in ihren Einkaufswagen zu legen. Unseres schien auch damit zu tun zu haben, dass ein Index zu dieser Zeit aktualisiert wurde (höchstwahrscheinlich ein Neuindex der Katalogtabelle). Das einzige, was uns letztendlich das Problem besorgt hat, war die Implementierung der asynchronen Neuindizierung (wir kauften eine Erweiterung).
Wir haben dieses Problem ebenfalls untersucht und versucht, Produkte parallel zu speichern.
Das Hauptproblem, mit dem wir konfrontiert waren, bestand darin, dass nach der anfänglichen Speicherung eines Produkts die nachfolgenden Indexierungsprozesse nicht durch die Transaktion zur Produkteinsparung abgedeckt wurden. Wenn wir also in einen Deadlock gerieten, wurde dies durch den Indexer verursacht. Um dies zu verhindern, hatten wir eine inkonsistente Datenbank, die ungültige Produkt-URLs verursachte und uns zwang, alles neu zu indizieren, wenn es passierte.
Die Lösung, die wir am Ende hatten, bestand darin, den Indexer in die Transaktion einzubeziehen und eine Transaktion, die in einem Deadlock endete, erneut zu versuchen. Dies ist jedoch keine ideale Lösung, es ist eher das Beste, was wir uns vorstellen können und es funktioniert in 99% der Fälle.
Das Problem mit Magento ist, dass die Programmierung lappig ist und der ereignisgesteuerte swiss-army-knife-Ansatz für die Codierung zu vielen tiefgreifenden Problemen in der inneren Mechanik von Magento führt.
Unser nächster Ansatz wird unsere eigene, von Grund auf neu geschriebene Schnittstelle sein, um Produkte parallel zu speichern und die Datenbank mit dem gleichen Ergebnis zu verlassen, wie es ein Magento-Save hätte. Dies bedeutet natürlich, dass wir Erweiterungen nicht mehr hinzufügen können, ohne sie in das neue Konzept zu integrieren, falls sie produktbezogen sind.
Hier ist eine großartige Open-Source-Lösung - Ссылка
Dieses Modul ist sehr einfach und konzentriert sich auf eine Aufgabe. Er ersetzt den DB-Adapter durch eine erweiterte Version, die Abfragen erneut versucht, wenn die Verbindung unterbrochen wird, die Abfrage keine erforderliche Sperre erhalten kann oder ein Deadlock auftritt. Diese drei Situationen werden über Ausnahmemeldungen erkannt. Der zugrundeliegende (übergeordnete) Code umschließt tatsächlich mindestens eine dieser Ausnahmen innerhalb einer anderen Ausnahme, so dass wir dies überprüfen und die Ausnahme bei Bedarf entfernen.
Tags und Links magento database-deadlocks