Magento 2 - Transakcja bazy danych dla wielu obiektów modelu / modelu zasobu?


11

Jeśli mam logikę polegającą na aktualizacji wielu obiektów modelu, które zaktualizują kilka tabel w bazie danych, jak zapewnić transakcję bazy danych, aby zapewnić integralność danych?

Odpowiedzi:


22

Prawdopodobnie zapisujesz agregację wielu połączonych obiektów. Określ, który z tych obiektów jest korzeniem , na przykład:

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

Dodaj logikę aktualizacji do modelu zasobów katalogu głównego i użyj tam transakcji.

Jak korzystać z transakcji

  1. Jeśli chcesz zapisać wiele instancji modelu, możesz użyć modelu transakcji. Wstaw model transakcji \Magento\Framework\DB\TransactionFactorydo modelu zasobów i użyj go w następujący sposób:

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

    save()Metoda zatwierdzania lub wycofywania jest automatycznie obsługiwana .

  2. Alternatywnie możesz użyć transakcji bezpośrednio (jeśli korzystasz z innych aktualizacji bazy danych niż $model->save():

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

Czy istnieje obsługiwany sposób zapisywania wielu obiektów podczas korzystania z repozytoriów? Wewnętrznie wywołują save()metody modeli zasobów, więc każdy z nich zostanie zapisany w osobnych transakcjach. Repozytoria często zawierają pewną logikę sprawdzania poprawności, dlatego ogólnie zaleca się ich stosowanie zamiast zwykłych save()metod modeli zasobów .
Bartosz Kubicki

1
@BartoszKubicki jest. Jeśli dwa modele zasobów używają tego samego połączenia (co zwykle robią, domyślnego), zapisanie relacji w afterSave () pierwszego zasobu spowoduje dodanie zapytań do tej samej transakcji. Zobacz, jak zapisywane są zamówienia, linia po linii. OrderRepository :: save () to punkt wejścia.
vitoriodachef
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.