我需要对一段代码使用事务,它包含多个插入。在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');
}
答案 0 :(得分:1)
实际上,我们应该关注较小的事务边界,以便我们可以避免任何锁定,如果发生在Db中,但有时我们需要整个代码块来执行或不执行,所以在这种情况下我们几乎没有任何机会留给我们,您需要尽可能模块化您的代码。
答案 1 :(得分:1)
这里需要注意的是,try块有多大,我们应该能够捕获它抛出的异常并采取相应的行动。
但是你在这里使用了
catch (Exception $exc)
你将无法捕捉到不同的例外情况。这有助于调试并显示异常的正确原因。
此外,如果是一个交易,我们必须将它放在一个试块中