2017-04-27 47 views
-1

我正在使用django(1.5 with mysql)select_for_update方法从一个模型中获取数据并根据请求将这些数据提供给用户,但是当两个用户同时请求时,它会为两个用户返回相同的数据,请参阅示例代码下面如何使用django queryset get方法处理并发?

models.py 
class SaveAccessCode(models.Model): 
    code = models.CharField(max_length=10) 

class AccessCode(models.Model): 
    code = models.CharField(max_length=10) 
    state = models.CharField(max_length=10, default='OPEN') 


views.py 
def view(request, code): 
    # for example code = 234567 
    acccess_code = AccessCode.objects.select_for_update().filter(
    code=code, state='OPEN') 

    acccess_code.delete() 
    SaveAccessCode.objects.create(code=code) 
    return 

并发请求将产生SaveAccessCode具有相同的代码的两个记录,请指导我如何处理这种情况更好的方式

+0

为什么它不能为两个用户提供相同的数据?你为什么不想要它,它应该怎么做呢?你怎么称呼这种方法? –

回答

0

您需要在模型上设置一些标志做select_for_update时,像:

qs.first().update(is_locked=True)` 

而在这之前应该做的选择像

qs = self.select_for_update().filter(state='OPEN', is_locked=False).order_by('id') 

然后用户后,我想,做它的东西,保存,设置标志is_locked=False和保存。

也使fetch_available_code作为@staticmethod