建议,php mysql事务用于插入块中的多个表

时间:2012-11-26 05:13:13

标签: php mysql transactions symfony-1.4 propel

我需要对一段代码使用事务,它包含多个插入。在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');
    }

2 个答案:

答案 0 :(得分:1)

实际上,我们应该关注较小的事务边界,以便我们可以避免任何锁定,如果发生在Db中,但有时我们需要整个代码块来执行或不执行,所以在这种情况下我们几乎没有任何机会留给我们,您需要尽可能模块化您的代码。

答案 1 :(得分:1)

这里需要注意的是,try块有多大,我们应该能够捕获它抛出的异常并采取相应的行动。

但是你在这里使用了

catch (Exception $exc)

你将无法捕捉到不同的例外情况。这有助于调试并显示异常的正确原因。

此外,如果是一个交易,我们必须将它放在一个试块中