Мне нужно использовать транзакцию для блока кода, он состоит из нескольких вставок. Хорошо ли иметь весь блок кода в блоке 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');
}