我需要使用事務處理一段代碼,它由多個插入組成。在try.catch塊之前啓動事務是否在try catch塊中包含全部代碼是一個好習慣。然後,對於捕獲的任何異常,回滾其他事務提交。建議,php mysql事務插入塊中的多個表
基本問題:
- 是不好的做法,一個交易週期內有整個代碼塊?
- 如果這是一個不好的做法,什麼是處理這個問題的好方法,爲什麼?
下面是一個代碼塊:
$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');
}
你說的意思是「你將不能夠捕獲不同的例外。」如果您針對不同的異常提及了不同的catch塊,那麼我在我的代碼中就已經有了它,我只是使用了一個更通用的方法。順便說一句,我相信這抓住了所有的例外,但這不是最好的做法。 –
這就是我所說的 - 「順便說一句,我相信這抓住了所有的例外,雖然這不是最好的做法」 –