Se eu tiver uma lógica que envolva a atualização de vários objetos de modelo que atualizarão algumas tabelas no banco de dados, como fornecer uma transação de banco de dados para garantir a integridade dos dados?
11
Se eu tiver uma lógica que envolva a atualização de vários objetos de modelo que atualizarão algumas tabelas no banco de dados, como fornecer uma transação de banco de dados para garantir a integridade dos dados?
Você provavelmente está salvando um agregado de vários objetos conectados. Determine qual desses objetos é a raiz , por exemplo:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
Inclua a lógica de atualização no modelo de recursos da raiz e use uma transação lá.
Se você deseja salvar várias instâncias do modelo, pode usar o modelo de transação. Injete uma fábrica de transações \Magento\Framework\DB\TransactionFactory
no seu modelo de recursos e use-o assim:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
A confirmação ou reversão é tratada automaticamente pelo save()
método.
Como alternativa, você pode usar transações diretamente (se você usar outras atualizações do banco de dados além de $model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
métodos de modelos de recursos, para que cada um deles seja salvo em transações separadas. Os repositórios geralmente contêm alguma lógica de validação; portanto, geralmente é recomendável usá-los em vez desave()
métodos simples de modelo de recurso .