Предложение, транзакция 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)


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

person Vardan Gupta    schedule 26.11.2012

Здесь следует отметить, что каким бы большим ни был блок 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