2012-07-01 3 views
0

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 топлист сущности для текущей недели.

Возможно ли это?

Как предотвратить это?

ответ

2

Да, это возможно. Вы должны использовать блокировки при выполнении вычислений на основе значений db (которые хранятся в db).

Подробнее о замках в Документах доктрины в: Locking support

+0

Спасибо, теперь я знаю, что я должен заново продумать свой код и я, вероятно, использовать блокировку – loostro

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

  • Нет связанных вопросов^_^