Magento 2 - Giao dịch cơ sở dữ liệu cho nhiều đối tượng mô hình / mô hình tài nguyên?


11

Nếu tôi có một logic liên quan đến việc cập nhật nhiều đối tượng mô hình sẽ cập nhật một vài bảng trong cơ sở dữ liệu, làm thế nào để cung cấp một giao dịch cơ sở dữ liệu để đảm bảo tính toàn vẹn dữ liệu?

Câu trả lời:


22

Bạn có thể đang lưu một tập hợp của nhiều đối tượng được kết nối. Xác định đối tượng nào trong số này là gốc , ví dụ:

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

Thêm logic cập nhật trong mô hình tài nguyên của root và sử dụng một giao dịch ở đó.

Cách sử dụng giao dịch

  1. Nếu bạn muốn lưu nhiều phiên bản mô hình, bạn có thể sử dụng mô hình giao dịch. Tiêm một nhà máy giao dịch \Magento\Framework\DB\TransactionFactorytrong mô hình tài nguyên của bạn và sử dụng nó như thế này:

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

    Cam kết hoặc rollback được tự động xử lý theo save()phương pháp.

  2. Ngoài ra, bạn có thể sử dụng các giao dịch trực tiếp (nếu bạn sử dụng các cập nhật cơ sở dữ liệu khác ngoài $model->save():

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

Có cách nào được hỗ trợ để lưu các đối tượng đa dạng trong khi sử dụng kho không? Họ gọi nội bộ các save()phương thức của các mô hình tài nguyên, vì vậy mỗi phương thức sẽ được lưu trong các giao dịch riêng biệt. Các kho lưu trữ thường chứa một số logic xác thực, do đó thường được khuyến nghị sử dụng chúng thay vì các save()phương thức mô hình tài nguyên đơn giản .
Bartosz Kubicki

1
@BartoszKubicki có. Nếu hai mô hình tài nguyên sử dụng cùng một kết nối (mà chúng thường làm, thì một mô hình mặc định) lưu mối quan hệ trong afterSave () của tài nguyên đầu tiên sẽ khiến các truy vấn được thêm vào cùng một giao dịch. Nhìn vào cách các đơn đặt hàng được lưu, từng dòng. OrderRep repository :: save () là điểm vào.
vitoriodachef
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.