Magento 2-複数のモデル/リソースモデルオブジェクトのデータベーストランザクション?


11

データベース内のいくつかのテーブルを更新する複数のモデルオブジェクトの更新を伴うロジックがある場合、データの整合性を確保するためにデータベーストランザクションを提供するにはどうすればよいですか?

回答:


22

おそらく、複数の接続されたオブジェクトの集約を保存しています。これらのオブジェクトのどれがrootであるかを判別します。次に例を示します。

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

ルートのリソースモデルに更新ロジックを追加し、そこでトランザクションを使用します。

トランザクションの使い方

  1. 複数のモデルインスタンスを保存する場合は、トランザクションモデルを使用できます。\Magento\Framework\DB\TransactionFactoryリソースモデルにトランザクションファクトリを挿入し、次のように使用します。

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

    コミットまたはロールバックは、save()メソッドによって自動的に処理されます。

  2. または、トランザクションを直接使用することもできます(以下以外のデータベース更新を使用する場合$model->save()

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

リポジトリの使用中に複数のオブジェクトを保存するためのサポートされている方法はありますか?これらは内部save()的にリソースモデルのメソッドを呼び出すため、それぞれが個別のトランザクションに保存されます。多くの場合、リポジトリには検証ロジックが含まれているため、通常のリソースモデルsave()メソッドの代わりにそれらを使用することをお勧めします。
Bartosz Kubicki

1
@BartoszKubickiがあります。2つのリソースモデルが同じ接続を使用する場合(通常はデフォルト接続)、リレーションを最初のリソースのafterSave()に保存すると、クエリが同じトランザクションに追加されます。行ごとに注文がどのように保存されるかを調べます。OrderRepository :: save()がエントリポイントです。
vitoriodachef
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.