回答:
おそらく、複数の接続されたオブジェクトの集約を保存しています。これらのオブジェクトのどれがrootであるかを判別します。次に例を示します。
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
ルートのリソースモデルに更新ロジックを追加し、そこでトランザクションを使用します。
複数のモデルインスタンスを保存する場合は、トランザクションモデルを使用できます。\Magento\Framework\DB\TransactionFactory
リソースモデルにトランザクションファクトリを挿入し、次のように使用します。
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
コミットまたはロールバックは、save()
メソッドによって自動的に処理されます。
または、トランザクションを直接使用することもできます(以下以外のデータベース更新を使用する場合$model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
的にリソースモデルのメソッドを呼び出すため、それぞれが個別のトランザクションに保存されます。多くの場合、リポジトリには検証ロジックが含まれているため、通常のリソースモデルsave()
メソッドの代わりにそれらを使用することをお勧めします。