【问题标题】:Django potential critical sectionDjango 潜在临界区
【发布时间】:2017-01-22 10:12:20
【问题描述】:

我在 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) 添加到位置用户(通过其他视图)

  • flow - 1:删除位置,因为位置用户为 0(但这不正确,因为 flow-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

原子地?

【问题讨论】:

    标签: python django orm transactions critical-section


    【解决方案1】:

    只需使用事务并将数据库设为atomicitysitus

    原子性是数据库事务的定义属性。 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 2013-03-26
      • 2013-04-07
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多