Magento 2 - Transaksi basis data untuk beberapa model / objek model sumber daya?

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?

Paul
sumber

Jawaban:

22

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.

Cara menggunakan transaksi

  1. Jika Anda ingin menyimpan beberapa instance model, Anda dapat menggunakan model transaksi. Suntikkan pabrik transaksi \Magento\Framework\DB\TransactionFactorydalam 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.

  2. 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;
    }
    
Fabian Schmengler
sumber
Apakah ada cara yang didukung untuk menyimpan objek mutiple saat menggunakan repositori? Mereka secara internal memanggil 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 daripada save()metode model sumber daya biasa .
Bartosz Kubicki
1
@ BartoszKubicki ada. Jika dua model sumber daya menggunakan koneksi yang sama (yang biasanya mereka lakukan, yang standar) menyimpan relasi di afterSave () dari sumber daya pertama akan menyebabkan kueri ditambahkan ke transaksi yang sama. Lihatlah bagaimana pesanan disimpan, baris demi baris. OrderRepository :: save () adalah titik masuk.
vitoriodachef