Magento 2-多个模型/资源模型对象的数据库事务?


Answers:


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有。如果两个资源模型使用相同的连接(通常使用默认连接),则将关系保存在第一个资源的afterSave()中将导致将查询添加到同一事务中。逐行查看如何保存订单。OrderRepository :: save()是入口点。
vitoriodachef
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.