1) Код контроллера (Symfony2 рамочных):
$em = $this->getDoctrine()->getEntityManager();
// get latest toplist
$last = $em->getRepository('RadioToplistBundle:Toplist')->findOneBy(
array('number' => 'DESC')
);
// get current year and week of the year
$week = date('W');
$year = date('Y');
// if:
// [case 1]: $last is null, meaning there are no toplists in the database
// [case 2]: $last->getYear() or $last->getWeek() do not match current
// year and week number, meaning that there are toplists in the
// database, but not for current week
// then:
// create new toplist entity (for current week of current year)
// else:
// do nothing (return)
if($last && $last->getYear() == $year && $last->getWeek() == $week)
return;
else {
$new = new Toplist();
$new->setYear($year);
$new->setWeek($week);
$em->persist($new);
$em->flush();
}
Этого код выполняется при каждом запросе, чтобы просмотреть топлист результаты (фронтэнд) или список топлистов (серверный). В любое время, когда кто-то хочет получить доступ к toplist, мы сначала проверяем, следует ли нам создать новый объект toplist (для новой недели).Возможно ли, что два запроса одновременно удваивают этот код? (Предотвратить двойную запись базы данных)
2) Вопрос заключается в том:
Возможно ли, что:
- пользователь A переходит в mydomain.com/toplist в 00:00:01 в понедельник -> код должен генерировать новый объект
- сервер замедляет и берет его на 3 секунды, чтобы выполнить код
- так новый топлист объект сохраняется в базе данных в 00:00:04 в понедельник
- пользователя B переходит в mydomain.com/toplist в 00 : 00: 02 в понедельник
- в 00:00:02 там топлист еще не сохранены в базе данных, таким образом, запрос USERB в запускает код, чтобы создать еще один объект топлиста
И так .. через несколько секунд мы имеем 2 топлист сущности для текущей недели.
Возможно ли это?
Как предотвратить это?
Спасибо, теперь я знаю, что я должен заново продумать свой код и я, вероятно, использовать блокировку – loostro