2017-01-22 17 views
0

меня такая ситуация в Framework Применение Django REST:Джанго потенциал критической секции

У меня есть Удалить вид:

def delete(self, request, pk, lid=None, *args, **kwargs): 

    user_info = self.get_object(pk) 
    if user_info: 
     location = Location.objects.filter(loc_id=lid).first() 
     location.users.remove(user_info) 
     if location.users.count() is 0: 
      //delete location 

     return Response(status=status.HTTP_200_OK) 

    return Response(status=status.HTTP_404_NOT_FOUND) 

Я думаю, что в этом коде есть потенциальная критическая секция:

  • потока - 1: Проверка счета пользователя местоположение -> отсчет 0

  • поток - 2: Добавить новый пользователь (user2) в местоположении пользователя (по другой точке зрения)

  • поток - 1: Удалить местоположение, так как пользователь расположения 0 (но это не правильно, потому что поток -2 добавила новый user_info).

Можно ли в Django, чтобы этот раздел (контрольное значение и операция удаления)

location = Location.objects.filter(loc_id=lid).first() 
location.users.remove(user_info) 
if location.users.count() is 0: 
    //delete location 

атомарно?

ответ

0

Просто используйте транзакцию и сделать Д.Б. Situs из atomicity:

Атомарность является определяющим свойством транзакций базы данных. atomic позволяет нам создать блок кода, в котором гарантируется атомарность в базе данных. Если блок кода успешно завершен, изменения привязаны к базе данных. Если есть исключение, изменения отбрасываются.


from django.db import transaction 

def delete(self, request, pk, lid=None, *args, **kwargs): 
    with transaction.atomic(): 
     user_info = self.get_object(pk) 
     if user_info: 
      location = Location.objects.filter(loc_id=lid).first() 
      location.users.remove(user_info) 
      if location.users.count() is 0: 
       # delete location 
       location.delete() 
      return Response(status=status.HTTP_200_OK) 

     return Response(status=status.HTTP_404_NOT_FOUND) 

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

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