Magento 2 - Transazione del database per più oggetti modello / modello risorsa?


11

Se ho una logica che prevede l'aggiornamento di più oggetti modello che aggiornerà alcune tabelle nel database, come fornire una transazione del database per garantire l'integrità dei dati?

Risposte:


22

Probabilmente stai salvando un aggregato di più oggetti connessi. Determina quale di questi oggetti è la radice , ad esempio:

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

Aggiungi la logica di aggiornamento nel modello di risorsa della radice e usa una transazione lì.

Come usare le transazioni

  1. Se si desidera salvare più istanze del modello, è possibile utilizzare il modello di transazione. Iniettare una factory di transazione \Magento\Framework\DB\TransactionFactorynel modello di risorsa e utilizzarla in questo modo:

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

    Il commit o il rollback viene gestito automaticamente dal save()metodo.

  2. In alternativa è possibile utilizzare le transazioni direttamente (se si utilizzano aggiornamenti di database diversi da $model->save():

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

Esiste un modo supportato per salvare oggetti multipli durante l'utilizzo dei repository? Chiamano internamente save()metodi di modelli di risorse, quindi ciascuno di essi verrà salvato in transazioni separate. I repository contengono spesso alcune logiche di convalida, quindi in genere si consiglia di utilizzarli anziché semplici save()metodi del modello di risorsa .
Bartosz Kubicki,

1
@BartoszKubicki c'è. Se due modelli di risorsa utilizzano la stessa connessione (cosa che fanno di solito, quella predefinita) salvando la relazione in afterSave () della prima risorsa, verranno aggiunte query alla stessa transazione. Guarda come vengono salvati gli ordini, riga per riga. OrderRepository :: save () è il punto di accesso.
vitoriodachef,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.