Предложение, транзакция php mysql для вставки в несколько таблиц в блоке

Мне нужно использовать транзакцию для блока кода, он состоит из нескольких вставок. Хорошо ли иметь весь блок кода в блоке try catch, начинать транзакцию перед блоком try..catch. Затем для любого пойманного исключения откатите транзакции, которые еще не зафиксированы.

Основной вопрос:

  • это плохая практика - иметь весь блок кода в одном цикле транзакции?
  • Если это плохая практика, что было бы хорошим способом справиться с этим и почему?

Вот блок кода:

    $con = Propel::getConnection(SomeTablePeer::DATABASE_NAME);
    $con->beginTransaction();
    try {
        $currentRevision = $budgetPeriod->getRevision();
        $newRevision = $currentRevision->copy();
        $newRevision->setIdclient($client->getIdclient());
        $newRevision->setIsLocked(0);
        $newRevision->save();
        $currentRevision->setEffectiveTo($currentDate);
        $currentRevision->save();

        $currentRevisionHasCorporateEntities = $currentRevision->getCorporateEntitys();
        $newOldCorporateEntitiesRelations = array();

        foreach ($currentRevisionHasCorporateEntities as $currentRevisionHasCorporateEntity) {

            $newRevisionHasCorporateEntity = $currentRevisionHasCorporateEntity->copy();
            $newRevisionHasCorporateEntity->save();
        }

     // this continues for a while there are a whole list of insertions based on previous insertion and on and on.
    }catch (Exception $exc) {
        $con->rollback();
        $this->getUser()->setFlashError('Error occured! Transaction Failed');
    }

person ro ko    schedule 26.11.2012    source источник


Ответы (2)


arrow_upward
1
arrow_downward

На самом деле, мы должны сосредоточиться на меньших границах транзакций, чтобы мы могли избежать любых блокировок, если они происходят в Db, но иногда нам нужно, чтобы весь блок кода либо выполнялся, либо нет, поэтому в этом случае у нас вряд ли остались шансы, вам нужно максимально модульизируйте свой код.

person Vardan Gupta    schedule 26.11.2012

arrow_upward
1
arrow_downward

Здесь следует отметить, что каким бы большим ни был блок try, мы должны иметь возможность перехватывать генерируемые им исключения и предпринимать соответствующие действия.

Но здесь вы использовали

catch (Exception $exc)

вы не сможете поймать разные исключения. Это полезно для отладки и отображения правильной причины исключения.

Кроме того, если это транзакция, мы должны иметь ее в одном блоке попытки.

person Shamis Shukoor    schedule 26.11.2012
comment
Что вы имеете в виду, вы не сможете поймать разные исключения. Если вы имеете в виду, что разные блоки catch для разных исключений, которые у меня есть в моем коде, я просто использовал, например, более общий метод. Кстати, я считаю, что это улавливает все исключения, хотя это не лучшая практика. - person ro ko; 26.11.2012
comment
это то, что я говорил - кстати, я считаю, что это улавливает все исключения, хотя это не лучшая практика - person Shamis Shukoor; 26.11.2012