Magento 2 - транзакція бази даних для декількох об'єктів моделі / ресурсу?


11

Якщо у мене є логіка, яка передбачає оновлення декількох об'єктів моделі, які оновлюють кілька таблиць у базі даних, як забезпечити транзакцію бази даних для забезпечення цілісності даних?

Відповіді:


22

Ви, ймовірно, зберігаєте сукупність декількох підключених об'єктів. Визначте, який із цих об'єктів є коренем , наприклад:

               [order]              <------ this is the root
               /  |  \
billing_address   |   shipping_address
                  |
            order_items

Додайте логіку оновлення в ресурсну модель кореня та використовуйте там транзакцію.

Як користуватися транзакціями

  1. Якщо ви хочете зберегти кілька екземплярів моделі, ви можете використовувати модель транзакцій. Введіть фабрику транзакцій \Magento\Framework\DB\TransactionFactoryу вашу модель ресурсів і використовуйте її так:

    $saveTransaction = $this->transactionFactory->create();
    $saveTransaction->addObject($objectToSave);
    $saveTransaction->addObject($otherObjectToSave);
    ...
    $saveTransaction->save();

    Здійснення фіксації або відкату автоматично обробляється save()методом.

  2. Крім того, ви можете використовувати транзакції безпосередньо (якщо ви використовуєте інші оновлення бази даних, ніж $model->save():

    $connection = $this->getConnection();
    $connection->beginTransaction();
    try {
        ...
        $connection->commit();
    } catch (\Exception $e) {
        $connection->rollBack();
        throw $e;
    }

Чи існує якийсь підтримуваний спосіб збереження нескінченних об'єктів під час використання сховищ? Вони внутрішньо викликають save()методи моделей ресурсів, тому кожна з них буде збережена в окремих транзакціях. Репозиторії часто містять певну логіку перевірки, тому зазвичай рекомендується використовувати їх замість простих save()методів моделювання ресурсів .
Bartosz Kubicki

1
@BartoszKubicki є. Якщо дві моделі ресурсів використовують одне і те ж з'єднання (що вони зазвичай роблять, за замовчуванням), збереження відношення в afterSave () першого ресурсу призведе до додавання запитів до однієї транзакції. Подивіться, як зберігаються замовлення, рядок за рядком. OrderRepository :: save () - точка входу.
vitoriodachef
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.