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?
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?
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.
Jeśli chcesz zapisać wiele instancji modelu, możesz użyć modelu transakcji. Wstaw model transakcji \Magento\Framework\DB\TransactionFactory
do 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 .
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;
}
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łychsave()
metod modeli zasobów .