Si tengo una lógica que implica la actualización de varios objetos de modelo que actualizarán algunas tablas en la base de datos, ¿cómo proporcionar una transacción de base de datos para garantizar la integridad de los datos?
11
Si tengo una lógica que implica la actualización de varios objetos de modelo que actualizarán algunas tablas en la base de datos, ¿cómo proporcionar una transacción de base de datos para garantizar la integridad de los datos?
Probablemente esté guardando un agregado de múltiples objetos conectados. Determine cuál de estos objetos es la raíz , por ejemplo:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
Agregue la lógica de actualización en el modelo de recurso de la raíz y use una transacción allí.
Si desea guardar varias instancias de modelo, puede usar el modelo de transacción. Inyecte una fábrica de transacciones \Magento\Framework\DB\TransactionFactory
en su modelo de recurso y úsela así:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
Confirmar o deshacer se maneja automáticamente por el save()
método.
Alternativamente, puede usar transacciones directamente (si usa otras actualizaciones de la base de datos que no sean $model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
métodos de modelos de recursos, por lo que cada uno de ellos se guardará en transacciones separadas. Los repositorios a menudo contienen cierta lógica de validación, por lo que generalmente se recomienda usarlos en lugar desave()
métodos de modelo de recursos simples .