我做了很多搜索都没有成功。我想了解这种情况下的flush((过程。
//Edit updateOptions
public function updateOptions($values){
setOption('country',$values['country']);
setOption('city',$values['city']);
setOption('adress',$values['adress']);
setOption('CP',$values['CP']);
setOption('country_code',$values['country_code']);
}
function setOption($name, $value){
$em = $this->getEntityManager('option.manager');
$option = $this->getOption($name); //Entity Options
$option->setValue($value);
$em->persist($option);
$em->flush();
}
当我查看 mysql.log 或分析器时,我发现:
START TRANSACTION
UPDATE options SET value = 'France' WHERE name = 'country';
COMMIT
START TRANSACTION
SAVEPOINT DOCTRINE2_SAVEPOINT_2
UPDATE options SET value = 'Paris' WHERE name = 'city';
RELEASE SAVEPOINT DOCTRINE2_SAVEPOINT_2
SAVEPOINT DOCTRINE2_SAVEPOINT_2
UPDATE options SET value = 'Rue de Rivoli' WHERE name = 'adress';
RELEASE SAVEPOINT DOCTRINE2_SAVEPOINT_2
SAVEPOINT DOCTRINE2_SAVEPOINT_2
UPDATE options SET value = '75001' WHERE name = 'CP';
RELEASE SAVEPOINT DOCTRINE2_SAVEPOINT_2
SAVEPOINT DOCTRINE2_SAVEPOINT_2
UPDATE options SET value = '33' WHERE name = 'country_code';
RELEASE SAVEPOINT DOCTRINE2_SAVEPOINT_2
ROLLBACK
只有第一个被更新/提交,我明白了,但我不明白为什么下一个被回滚?
例如,如果我在循环中使用 setOption((,也会发生这种情况。
帮助会很棒。提前谢谢。
不要每次都调用 persist(( 和 flush((。我想这可能是原因。由于您没有明确告诉 EM 开始交易,因此它可能会尝试通过 persist()
和 flush()
的组合来猜测它
尝试以下操作:
扩展您的updateOptions
方法
public function updateOptions ()
{
$em = $this->getEntityManager( 'option.manager' );
$em->beginTransaction();
setOption( 'country', 'France' );
setOption( 'city', 'Paris' );
setOption( 'adress', 'Rue de Rivoli' );
setOption( 'CP', '75001 ' );
setOption( 'country_code', '33' );
$em->flush(); //just notif EM there're records to UPDATE
//$success = false;
try
{
$em->commit();
//$success = true;
}
catch ( Exception $ex )
{
$em->rollback();
// my fav is followinn: in DEV re-throw exception so you can inspect all in symfony-debug-bar
// in prod just additional emergency log (monolog + swiftmailer) so you get an email
if( $this->get( 'kernel' )->getEnvironment() !== 'prod' )
{
throw $ex;
}
$this->get( 'logger' )->addEmergency( 'Oh nooo! Not again :/' );
}
//return $success;
}
function setOption($name, $value){
$option = $this->getOption($name); //Entity Options
$option->setValue($value);
}