public function actionCreate() {
$model = new Escritorio;
$model->endereco = new Endereco;
$model->observacao = new Observacao;
$model->loginWeb = new LoginWeb;
catch (Exception $e) {
/* CATCH DE ERROS + ROLLBACK DA TRANSAÇÃO */
$trans->rollback();
}
é feito um rollback, agora apresentando meu problema:
Todas essas relations possuem primary key com auto increment, porém se gerar um erro, essa chave some e no próximo post a chave anterior não é usada e sim, a anterior+1, simulando erros, nas chaves de observação fiquei com uma brecha de 20 id’s
/**
* Cria um novo Escritório
* Caso o cadastro seja efetuado com sucesso o mesmo será redirecionado a tela view
*/
public function actionCreate() {
$model = new Escritorio;
$model->endereco = new Endereco;
$model->observacao = new Observacao;
$model->loginWeb = new LoginWeb;
// Descomentar para usar Validação Ajax
// $this->performAjaxValidation($model);
/* CREATE - POST */
if (null !== Funcoes::filter('post', 'Escritorio')):
$trans = Yii::app()->db->beginTransaction();
try {
/*
* ATRIBUIÇÃO DO POST AOS RESPECTIVOS OBJETOS
*/
$model->attributes = Funcoes::filter('post', 'Escritorio');
$model->observacao->attributes = Funcoes::filter('post', 'Observacao');
$model->endereco->attributes = Funcoes::filter('post', 'Endereco');
/*
* SAVE OBSERVACAO - Caso sejá diferente de vazio
*/
if (empty($model->observacao_id)):
if (!empty($model->observacao->texto)):
$model->observacao->texto = trim($model->observacao->texto);
if ($model->observacao->save(true)):
$model->observacao_id = $model->observacao->id;
else:
throw new Exception;
endif;
else:
throw new Exception;
endif;
endif;
/*
* FIM SAVE OBSERVAÇÃO
*/
/*
* SAVE ENDEREÇO
*/
if (empty($model->endereco_id)):
if ($model->endereco->save(true)):
$model->endereco_id = $model->endereco->id;
else:
throw new Exception;
endif;
endif;
/*
* FIM SAVE ENDEREÇO
*/
/*
* SAVE ESCRITÓRIO
*/
if ($model->save(true)):
/*
* SAVE LOGIN - SAVE ESCRITÓRIO
*/
if (empty($model->login_web_id)):
if ($model->loginWeb->generateLogin($model, 'escritorio')):
$model->login_web_id = $model->loginWeb->id;
if ($model->save(true)):
/*
* FIM SAVE LOGIN - SAVE ESCRITÓRIO
*/
/*
* SAVE TAGS
*/
if (null != Funcoes::filter('post', 'tags')):
foreach (Funcoes::filter('post', 'tags') as $tag):
if (!EscritorioTag::addTag($model, $tag, 'escritorio')):
throw new Exception;
endif;
endforeach;
endif;
/*
* FIM SAVE TAGS
*/
/*
* SAVE EMAILS
*/
if (null != Funcoes::filter('post', 'emails')):
foreach (Funcoes::filter('post', 'emails') as $new_email):
if (!Email::addEmail($new_email, $model, 'escritorio')):
throw new Exception;
endif;
endforeach;
endif;
/*
* FIM SAVE EMAILS
*/
else:
throw new Exception;
endif;
else:
throw new Exception;
endif;
endif;
/*
* COMMIT DA TRANSAÇÃO + REDIRECT
*/
else:
throw new Exception;
endif;
$trans->commit();
$this->redirect(array('view', 'id' => $model->id));
} catch (Exception $e) {
/* CATCH DE ERROS + ROLLBACK DA TRANSAÇÃO */
$trans->rollback();
}
endif;
/* FIM CREATE - POST */
$this->render('create', array(
'model' => $model
));
}
Me parece que o beginTransaction() não está segurando os insert, ai quando da erro, ele deleta esses registro, e como as tabelas é auto incremento, esses ID são perdido.
não resolveu… porém acredito que isso seja uma segurança do banco de dados pelo que pesquisei… mas procuro uma forma de amenizar essa diferença entre id’s…
aqui uma pessoa explica um pouco melhor sobre isso…
Se eu estivesse com esse problema, eu tentava resolver da seguinte maneira.
Debugar inserção por inserção, verificar onde o sistema está inserindo e o por que está inserindo.
Eu não uso auto incremento, por que não gosto de perde ID no banco de dados.
Lendo um pouco no stackoverflow que mandou, foi o que eu disse, por ser auto incremento, ele já vai registrando os valores, para caso outro usuário não use o mesmo ID, e no final o sistema finaliza a inserção caso tenha sucesso ou remove todo o registro caso não tenha sucesso, como os campos são auto incremento, você perde esse ID, por isso que as vezes você perde 20 ID’s.