2016-08-07 2 views
2

Я пишу модульные тесты для приложения Symfony 2/Doctrine 2, и я сталкиваюсь с проблемой параллелизма.Doctrine 2 Проблемы параллелизма

код выглядит следующим образом:

$obj = new Obj(); 
$obj->setName('test'); 

... etc ... 

$em->persist($obj); 
$em->flush(); 

... 

$qb = $em->getRepository('Obj'); 
// Select object using DQL 

$this->assertTrue($obj !== null); 

На данный момент $ OBJ часто нуль. То есть DQL-запрос не смог найти его. Если я добавляю точку останова и приостанавливаю выполнение где-то перед выполнением DQL, всегда найдется $ obj. Если нет, это обычно не встречается, но иногда оно встречается.

Я попытался обертывание вставки в сделке:

$em->getConnection()->beginTransaction(); 

$obj = new Obj(); 
$obj->setName('test'); 

... etc ... 

$em->persist($obj); 
$em->flush(); 

$em->getConnection()->commit(); 

Это не похоже, чтобы помочь.

Я попытался добавить паузу между вставкой и запросом DQL:

sleep(1); 

Это приводит к ожидаемому поведению последовательно. Таким образом, мой вывод о том, что это проблема параллелизма. Или, по крайней мере, что-то делать с Доктриной, которая не сразу записывается на флеш.

Есть ли какой-либо способ с Doctrine 2, чтобы заставить запись в базу данных заполнить? Или событие для прослушивания? Или я делаю что-то еще не так?

+2

Включить журнал запросов для вашего сервера базы данных и посмотреть, как испускаются запросы. Для того, что вы считаете проблемой параллелизма, вы должны иметь 2 соединения, которые запускаются одновременно. Первое возможно, но маловероятно, второе невозможно в php (по умолчанию). – zerkms

+0

Похоже, что параллелизм - это не проблема. Я обнаружил зависящую от времени ошибку, которая вызывала мои несогласованные результаты. Если вы хотите добавить свой комментарий о регистрации в качестве ответа, я отмечу это как ответ, так как сразу нашел свою ошибку, следуя вашим советам. – Henry

+1

Вы лучше опубликуете ответ с объяснением проблемы – zerkms

ответ

2

Следуя советам zerkms, чтобы включить ведение журнала, я быстро отследил проблему до отказа в моем собственном коде. Не было проблем с параллелизмом.

На моем Mac я сделал следующее:

Edit: /usr/local/etc/my.cnf Добавьте эти строки:

general_log_file = /tmp/query.log 
general_log  = 1 

Тогда:

brew services restart apache2 

Далее я хвостами файл:

tail -f /tmp/query.log 

Я видел два запроса - вставку и выбор - выполнение в правильном порядке. Выполнение этих запросов непосредственно в клиенте MySQL выявило ошибку в моем коде.

Примечание: размещение журнала в /tmp/ гарантирует, что журналы удаляются каждый раз, когда я выхожу из системы.

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