2016-04-25 2 views
2

У меня есть следующий фрагмент кода для импорта определенных записей в мою базу данных. Он проверяет, существует ли почта. Если это не так, это создаст новый.Дублирующие строки с использованием нескольких экземпляров Doctrine

Этот сценарий работает в задании cron. Однако иногда его также нужно запускать вручную. Может случиться так, что два экземпляра этого сценария работают одновременно. Когда это происходит, дублируются записи. Я не понимаю, почему это было бы возможно.

Может ли кто-то пролить свет на эту проблему?

ответ

1

1) Простейшее решение предотвращает одновременное выполнение одних и тех же команд. Вы можете использовать https://github.com/ffreitas-br/command-lock-bundle

2) Вы можете просто поймать исключение в Еогеасп:

$em->persist($entity); 

try { 
    $em->flush(); 
} catch(UniqueConstraintViolationException $e) { 
    // Detach object to prevent exception with same entity on next flush() call. 
    $em->detach($entity); 
} 

Если вам нужно сохранить только один лица экземпляра:

$em->persist($entity); 

try { 
    $em->flush($entity); 
} catch(UniqueConstraintViolationException $e) { 
    // Nothing. 
} 

3) Если вы хотите получить выигрыш в производительности о запуске двух команд, параллельно о очереди сообщений. https://github.com/videlalvaro/RabbitMqBundle

Производитель:

foreach ($users as $user) { 
    $producer->produce(new Message($user['name'])); 
} 

Потребитель:

$name = $message->getName(); 

$entity = new Post(); 
$entity 
    ->setName($name) 
; 

$em = $this->getContainer()->get('doctrine')->getManager(); 
$em->persist($entity); 
$em->flush(); 
+0

В случае я использую 'UniqueConstraintViolationException' я должен делать какие-либо изменения в моей сущности? – Peter

+0

Спасибо, хороший ответ, был обновлен, добавлен вызов detach(). –

Смежные вопросы