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?

Paweł
źródło

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;
    }
Fabian Schmengler
źródło
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