コードのブロックにトランザクションを使用する必要があります。これは複数の挿入で構成されています。コードのブロック全体をtrycatchブロック内に配置し、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');
}