Проблема deadlock issue є однією з найбільших і найскладніших проблем для вирішення в Magento 2, з якою рано чи пізно стикається кожен розробник Magento. Коли ви почнете шукати, як виправити deadlock issues в Magento, вам буде важко знайти остаточну відповідь.

Отже, у цій статті ми додали все, що вам потрібно знати, щоб усунути проблеми з deadlock або принаймні значно зменшити їх.

Зазвичай проблема з deadlock виникає, коли багато ресурсів задіяно з продуктом, наприклад:

Таким чином, усунення проблем із deadlock у Magento зводиться до пришвидшення збереження продукту.

1. Виміряйте час виконання збереження продукту

Для цього створіть папку scripts у вашому кореневому каталозі Magento 2. Потім додайте до нього файл test.php із таким кодом:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);

$obj = $bootstrap->getObjectManager();

$state = $obj->get(Magento\Framework\App\State::class);
$state->setAreaCode('adminhtml');

$startTime = microtime(true);

$productRepo = $obj->get(Magento\Catalog\Api\ProductRepositoryInterface::class);
$product = $productRepo->getById(39);
$product->setName($product->getName() . ' - test');
$product->setStoreId(0);
$productRepo->save($product);

$endTime = microtime(true);
$executionTime = ($endTime - $startTime);

echo " Execution time of script = ".$executionTime." sec";
?>

Потім запустіть php scripts/test.php, щоб виміряти час, необхідний для збереження одного продукту через репозиторію продуктів.

Scripts.test.php

На чистій Magento 2.4.4 це займає менше однієї секунди. Для звичайних магазинів Magento 2 прийнятне значення становить до 2 секунд.

Якщо збереження продукту виконується менш ніж за 2 секунди, ви можете пропустити цю частину та перейти до наступного кроку.

Якщо вам потрібно з’ясувати, яке розширення викликає цю проблему, найпростіший спосіб зробити це:

  1. Вимкніть усі сторонні розширення Magento 2 і виміряйте час, потрібний для збереження продукту.
  2. Увімкніть усі розширення одне за одним, вимірюючи при цьому швидкість збереження продукту.

Роблячи це крок за кроком для кожного розширення, ви дізнаєтеся, яке розширення має найбільший вплив на вашу продуктивність.

2. Перевірте налаштування бази даних

Magento рекомендує використовувати наступні налаштування бази даних для кращої продуктивності. Отже, якщо у вас виникли проблеми з deadlock в Magento, перевірте це.

My SQL Config Requirements in Magento

Ви також можете зіткнутися з такою проблемою:

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction, query was...

Ви можете спробувати змінити вузол блокування у вашому app/etc/env.php файлі і змінити префікс у внутрішньому вузлі налаштування.

<?php
return [
'lock' => [
       'provider' => 'db',
       'config' => [
'prefix' => 'new-prefix-here'
    ]
]
];

Потім просто скиньте індексатори та знову спробуйте зробити reindex.

3. Прослідкуйте за виконанням кронів

Якщо проблеми з deadlocks Magento виникають під час виконання cron задачі, ми наполегливо рекомендуємо встановити якісь розширення розкладу для кронів в Magento 2.

Вони дозволяють переглядати діаграму виконання cron задач і змінювати їхній розклад, щоб зменшити вплив на базу даних і кількість запитів до бази даних в той же час.

Якщо ви бачите, що у вас одночасно виконується кілька важких процесів (довше 10 хвилин), спробуйте перепланувати їх, щоб рівномірно розподілити навантаження на базу даних.

 

Product Saving Time Via Repository