После обновления CS-Cart 4.14.3 и модуля CommerceML (Beta) не работает с таблицами InnoDB

Переписка с технической поддержкой не принесла пользы, так как там отвечает не технический специалист и он не разбирается в теме.

Сайт работает с учетной системой МойСклад, интеграция происходит через модуль CommerceML (Beta). БД таблицы в InnoDB.

Суть в том, что CommerceML (Beta) с CS-Cart 4.14.2.SP1 - работает нормально и с MyISAM и с InnoDB.
А вот после последнего обновления CommerceML (Beta) и CS-Cart 4.14.3 - не работает с InnoDB.
После обновления посыпались ошибки БД https://prnt.sc/UZYzGDd4m-dA, интеграция поломалась. И прошу заметить, это штатный модуль самого CS-Cart !!!

Прошу в оперативном порядке устранить данный баг. Тикет id=101618176 Обращение №: #103498492
и подготовить патч по устранению данной проблемы.

1 лайк

Перенес топик из багтрекера.

Модуль CommerceML по умолчанию работает с таблицами MyISAM.
При конвертации таблиц в InnoDB возможно появление дедлоков, поэтому я рекомендую не менять стандартную структуру таблиц.

Как тогда прокомментируете баг, что в предыдущей версии все работало как надо, а в новой ломается все?
Модуль CommerceML при условии MyISAM обновление цен и остатков у нас происходит за 1 час, а при InnoDB за 7 минут. Что с этим делать?

3 лайка

Техническая поддержка всячески пытается увернуться от нового бага.
Каждый новый ответ от ТП, это их новая история. Каждый специалист ТП пишет что-то свое, извиняясь за ответ предыдущего специалиста ТП.

  1. Ошибка: Duplicate entry https://prnt.sc/9Dy1TjmxKNaR
  2. Ошибка: Deadlock found when trying to get lock; try restarting transaction (1213) https://prnt.sc/w9Jhcw1xPEFO

Никто не хочет решать проблему!

1 лайк

UP. Техническая поддержка начала процесс поиска решения проблемы. Внедрили рекомендации ТП, пока все работает, подождем до понедельника! ТП, заранее спасибо за отклик!

Спасибо ТП за помощь! Все работает! Если кому-то необходимо будет решение этой проблемы, ТП CS CART уже знает ответ.

Добрый день.

Поделитесь, пожалуйста, решением в этой теме.

Пожалуйста, попробуйте заменить код:

} else {
$logger->info(__(‘commerceml.controller.start_handle_catalog_import_execute’, [’[filename]’ => $filename]));
$command = ExecuteCatalogImportCommand::create($import_id, 0, ProductDto::REPRESENT_ENTITY_TYPE);
}

на код:

} else {
$logger->info(__(‘commerceml.controller.start_handle_catalog_import_execute’, [’[filename]’ => $filename]));
$command = ExecuteCatalogImportCommand::create($import_id, 30, ProductDto::REPRESENT_ENTITY_TYPE);
}

в файле app/addons/commerceml/controllers/frontend/commerceml.php и проверьте, как в таком случае будет выполняться обмен данными.

3 лайка

Уже вышел новый релиз и проблема оставалась актуальна. Попробовал применить правку: вроде заработало.

1 лайк

Изменения, которые должны будут решить проблемы с обменом большого количества товаров, со стороны Моего Склада, будут включены в версию 4.15.2.

При необходимости, их можно внести уже сейчас, применив .diff файл из приложенного архива.commerceml.zip (1,2 КБ)

Лично хочу объяснить, почему возникла проблема и возможно это же объяснит, почему она так долго решалась.

Для обмена с системой учёта, Мой Склад, как и 1С, использует стандарт CommerceML, который должен следовать Протоколу Обмена Данных.

В данном протоколе не указано никаких ограничений на время выполнения операции обмена данными, однако на стороне Моего Склада было решено поступить иначе, причём негласно (в публичном доступе, какой-либо информации на этот счёт мы найти не смогли). После длительного общения с их поддержкой, мы выяснили нюансы работы их системы обмена, которые я позволю себе процитировать:

Если на первый запрос мы получили статус progress, то через 30 секунд отправляем новый запрос, но между запросами таймаут увеличивается - до 45 секунд. Увеличить лимит на отправку запросов, увы, нет возможности с нашей стороны.

В результате чего, со стороны Моего Склада каждые 45 секунд отправлялись новые запросы на обработку уже обрабатываемых данных, вне зависимости от результатов предыдущих запросов. Это приводило к тому, что одна и та же выгрузка начинала обрабатываться параллельно в несколько потоков, что могло создавать ошибки записи в БД, т.к. два и более идентичных процесса пытались внести в БД магазина одни и те же записи.

В свою очередь, мы подстроились под эти ограничения: теперь, по прошествии определённого времени, процесс импорта прекращается и на сторону Моего Склада отправляется ключевое слово progress. После этого, Мой Склад отправит новый запрос и параллельных процессов обработки одних и тех же данных уже не возникнет.

3 лайка