Если у меня есть логика, которая включает обновление нескольких объектов модели, которые обновят несколько таблиц в базе данных, как обеспечить транзакцию базы данных для обеспечения целостности данных?
11
Если у меня есть логика, которая включает обновление нескольких объектов модели, которые обновят несколько таблиц в базе данных, как обеспечить транзакцию базы данных для обеспечения целостности данных?
Вы, вероятно, сохраняете совокупность нескольких связанных объектов. Определите, какой из этих объектов является корневым , например:
[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()
методов модели простых ресурсов .