Jika saya memiliki logika yang melibatkan memperbarui beberapa objek model yang akan memperbarui beberapa tabel dalam database, bagaimana cara menyediakan transaksi database untuk memastikan integritas data?
11
Jika saya memiliki logika yang melibatkan memperbarui beberapa objek model yang akan memperbarui beberapa tabel dalam database, bagaimana cara menyediakan transaksi database untuk memastikan integritas data?
Anda mungkin menyimpan agregat beberapa objek yang terhubung. Tentukan objek mana yang merupakan root , misalnya:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
Tambahkan logika pembaruan dalam model sumber daya dari root dan gunakan transaksi di sana.
Jika Anda ingin menyimpan beberapa instance model, Anda dapat menggunakan model transaksi. Suntikkan pabrik transaksi \Magento\Framework\DB\TransactionFactory
dalam model sumber daya Anda dan gunakan seperti ini:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
Komit atau kembalikan secara otomatis ditangani oleh save()
metode.
Atau Anda dapat menggunakan transaksi secara langsung (jika Anda menggunakan pembaruan basis data selain dari $model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
metode model sumber daya, sehingga masing-masing dari mereka akan disimpan dalam transaksi terpisah. Repositori sering mengandung beberapa logika validasi, sehingga umumnya disarankan untuk menggunakannya daripadasave()
metode model sumber daya biasa .