【问题标题】:How to handle concurrency with django queryset get method?如何使用 django queryset get 方法处理并发?
【发布时间】:2017-09-24 21:39:55
【问题描述】:

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

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记录,请指导我如何更好地处理这种情况

【问题讨论】:

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

标签: python mysql django python-2.7 django-1.5


【解决方案1】:

在执行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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2021-07-18
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多