Uns ist in SW 6.5.8.9 aufgefallen, dass nur bei der Mehrfachänderung in unregelmäßigen Abständen immer SQL-Fehler im Log stehen:
PHP Exception Doctrine\DBAL\Exception\DeadlockException:
"An exception occurred while executing a query: SQLSTATE[40001]:
Serialization failure:
1213 Deadlock found when trying to get lock; try restarting transaction" at
ExceptionConverter.php line 39
{"exception":"[object] (Doctrine\\DBAL\\Exception\\DeadlockException(code: 1213):
An exception occurred while executing a query: SQLSTATE[40001]:
Serialization failure: 1213 Deadlock found when trying to get lock;
try restarting transaction at /var/.../vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php:39
Die eigentliche Mehrfachänderung funktioniert aber. Jetzt stellen wir uns die Frage warum kommt diese Meldung und wie können wir das Problem lösen?
Wir haben den gleichen Fehler wenn wir über die API den Lagerbestand und die Preise in Schritten von 500 Produkten pro API Call akutalisieren:
Status code: 400
Response: {"errors":[{"code":"1213","status":"500","title":"Internal Server Error","detail":"An exception occurred while executing a query: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction","meta":{"trace":[{"file":"\/home\/user\/www.shop.de\/vendor\/doctrine\/dbal\/src\/Connection.php","line":1939,"function":"convert","class":"Doctrine\\DBAL\\Driver\\API\\MySQL\\ExceptionConverter","type":"-\u003E"},
Alle 5-10 API Calls passiert dieser Fehler. Wird der fehlgeschlagene API Call direkt im Anschluss nochmals wiederholt, funktioniert es im Normalfall.
Shopware Version 6.6.2.0
MySQL 8.0.37
Bei einem Shopware Store mit Version 6.5.6.0 und der gleichen MySQL Version haben wir dieses Problem nicht.
Wir haben das Problem bei einnem Kategorie Import von ca. 650 Kategorien und 200 Kategorien pro Call nach dem ersten Call.
Wir nutzen “indexing-behavior: use-queue-indexing” und haben den admin-worker aus, Queue wird queue-runner abarbeitet. Bei euch evtl. auch?
Unsere Theorie ist, dass nach dem ersten upsert der Queue Runner sich um die Indizierung kümmert und dann in den gleichen Tabellen schreibt und es hier zum Deadlock kommt.
Man könnte versuchen, indexing-behavior: disable-indexing zu verwenden und dann später zu indizieren …