Відповіді:
Ви, ймовірно, зберігаєте сукупність декількох підключених об'єктів. Визначте, який із цих об'єктів є коренем , наприклад:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
Додайте логіку оновлення в ресурсну модель кореня та використовуйте там транзакцію.
Якщо ви хочете зберегти кілька екземплярів моделі, ви можете використовувати модель транзакцій. Введіть фабрику транзакцій \Magento\Framework\DB\TransactionFactory
у вашу модель ресурсів і використовуйте її так:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
Здійснення фіксації або відкату автоматично обробляється save()
методом.
Крім того, ви можете використовувати транзакції безпосередньо (якщо ви використовуєте інші оновлення бази даних, ніж $model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
методи моделей ресурсів, тому кожна з них буде збережена в окремих транзакціях. Репозиторії часто містять певну логіку перевірки, тому зазвичай рекомендується використовувати їх замість простихsave()
методів моделювання ресурсів .