Я пишу модульные тесты для приложения 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 соединения, которые запускаются одновременно. Первое возможно, но маловероятно, второе невозможно в php (по умолчанию). – zerkms
Похоже, что параллелизм - это не проблема. Я обнаружил зависящую от времени ошибку, которая вызывала мои несогласованные результаты. Если вы хотите добавить свой комментарий о регистрации в качестве ответа, я отмечу это как ответ, так как сразу нашел свою ошибку, следуя вашим советам. – Henry
Вы лучше опубликуете ответ с объяснением проблемы – zerkms