마 젠토 2-다중 모델 / 자원 모델 객체에 대한 데이터베이스 트랜잭션?


11

데이터베이스의 일부 테이블을 업데이트하는 여러 모델 객체를 업데이트하는 논리가있는 경우 데이터 무결성을 보장하기 위해 데이터베이스 트랜잭션을 제공하는 방법은 무엇입니까?

답변:


22

여러 개의 연결된 개체 집합을 저장하고있을 수 있습니다. 다음 중 어떤 객체가 루트 인지 확인하십시오 .

               [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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.